首页 > 解决方案 > Vapor 4 中的原始查询

问题描述

在 Vapor 3 中,我能够获取到数据库的 newConnection 并使用以下命令调用原始 sql 查询:

return request.withNewConnection(to: .mysql) { (con) -> EventLoopFuture<T> in  
    return con.raw(sql)...
}

现在我正在将我的代码迁移到 Vapor 4,函数 raw 或 withNewConnection 消失了,我可以使用什么来进行原始查询。

重现步骤

return request.withNewConnection(to: .mysql) { (con) -> EventLoopFuture<T> in  
...
}

错误:无法根据成员“mysql”推断上下文基础“请求”类型的值没有成员“withNewConnection”

预期行为

在 request.db 中有一个函数,可以让我获得新连接或运行原始查询。

环境

标签: vapor

解决方案


尝试这个:

import SQLKit
struct Row:Content
{
    // fields go here
}
struct Context:Decodable
{
    let rows:[Row]
}
func rawDemo(_ request:Request) throws -> EventLoopFuture<View>
{
    return (request.db as! SQLDatabase).raw("SELECT * FROM MyTable").all(decoding:Row.self).flatMap
    {
        results in
        let context = Context(rows:results)
        return request.view.render("rawDemo", context)
    }
}

您必须按所示导入SQLKit模块并request.db转换SQLDatabase为才能执行原始查询。一旦你这样做了,它就变得很像 Vapor 3 方法。然而,有了 Vapor 4 中可用的新功能,我现在设法摆脱了所有原始查询并用流畅的 Fluent 查询替换!


推荐阅读