gpt4 book ai didi

swift - 在 Vapor 中使用原始 sql 返回条目总数

转载 作者:行者123 更新时间:2023-12-05 09:10:07 28 4
gpt4 key购买 nike

我正在尝试路由传入的 GET返回以下字符串:

“我们的模型总数是12”

其中 12 是保存到数据库中的特定模型的实际条目数。

现在执行此操作的一种方法是使用以下内容:

func index(_ req: Request) throws -> Future<String> {
return Model.query(on: req).all().map { models in
return "The total number of our models is \(models.count)"
}
}

这是记录最多但同时效率最低的方法。我找不到任何映射到 "SELECT COUNT(*) FROM Model;" 的查询

所以我求助于针对数据库编写自己的原始 SQL。我已经走到这一步了,但我不知道如何映射 [PostgreSQLColumn : PostgreSQLData]Future<String>

  func index(_ req: Request) throws -> Future<String> {
return req.withPooledConnection(to: .psql) { (conn) in
conn.raw("SELECT COUNT(*) FROM MODEL").all()
///....something something
}
}

最佳答案

您可以使用 all(decoding:)first(decoding: ) 解码返回的原始行

struct CountResult: Content {
let count: Int64
}

func index(_ req: Request) throws -> Future<String> {
req.withPooledConnection(to: .psql) { conn in
conn.raw("SELECT COUNT(*) as count FROM MODEL").first(decoding: CountResult.self).map {
$0?.count ?? 0
}.map {
"The total number of our models is \($0)"
}
}
}

我还建议看一下 SwifQLBridges以类型安全的方式处理原始 SQL 的库。

使用纯 SwifQL

struct CountResult: Content {
let count: Int64
}

func index(_ req: Request) throws -> Future<String> {
req.withPooledConnection(to: .psql) { conn in
let query = SwifQL
.select(Fn.count(MyTable.table.*))
.from(MyTable.table)
return conn.raw(query)
.first(decoding: CountResult.self)
.map { $0?.count ?? 0 }
.map {
"The total number of our models is \($0)"
}
}
}

使用 SwifQL + Bridges

func index(_ req: Request) throws -> Future<String> {
MyTable.query(on: .psql, on: req).count().map {
"The total number of our models is \($0)"
}
}

关于swift - 在 Vapor 中使用原始 sql 返回条目总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61846890/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com