Swift Vapor3 Raw SQL 使用新连接查询

Swift Vapor3 Raw SQL query with new connection

我正在尝试使用 Vapor3 执行 raw SQL 查询。不幸的是,为这种事情提供的文档在网站上非常模糊。

基本上我想做这样的事情:

router.get("example") { req -> Future<View> in
    let leaf = try request.make(LeafRenderer.self)

    // I can't get this next bit to work. Does anyone have any ideas how to do this? I seem to get all sorts of Xcode errors with .mysql, closures etc.
    let users = try request.withNewConnection(to: .mysql) { connection -> EventLoopFuture<[User]> 
       return try connection.raw("select * from users").all(decoding: User.self)
    }

    var context = [String: String]()
    context["user"] = users

    return leaf.render("example", context)
}

如果我在这里做错了,希望能提供任何帮助,我们将不胜感激。

提前致谢, 马特

您的代码失败是因为您没有正确实现闭包。您的路线 returns 在 let users... 闭包中,因此永远不会到达第二个 return

这个有效:

router.get("example")
{
    insecure.get("example") {
        request -> Future<View> in
        return request.withNewConnection(to: .mysql) {
            connection in
            return connection.raw("select * from User").all(decoding: User.self).flatMap(to:View.self) {
                users in
                return try request.make(LeafRenderer.self).render("example",["users":users])
            }
        }
    }
}

变化是:

  1. 除非您需要,否则无需定义 leaf
  2. users 的定义现在在闭包内。