1

我正在尝试路由传入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 
    }
  }
4

2 回答 2

4

要返回行数,您可以执行以下操作:

Model.query(on: req).count()

您也可以将过滤器应用于该查询

于 2020-05-17T17:40:59.577 回答
3

而不仅仅是你可以使用all()和解码返回的原始行first()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。

使用纯 SwiftQL

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 + 桥接器

func index(_ req: Request) throws -> Future<String> {
    MyTable.query(on: .psql, on: req).count().map {
        "The total number of our models is \($0)"
    }
}
于 2020-05-17T08:19:16.883 回答