Vapor 4 中的原始查询

Jua*_*los 7 vapor

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

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

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

重现步骤

return request.withNewConnection(to: .mysql) { (con) -> EventLoopFuture<T> in  
...
}
Run Code Online (Sandbox Code Playgroud)

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

预期行为

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

环境

  • Vapor 框架版本:4.7.1
  • Vapor 工具箱版本:vapor-beta
  • 操作系统版本:macOS Catalina

Nic*_*ick 7

尝试这个:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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


imi*_*ike 4

错误:无法推断引用成员“mysql”的上下文基础“Request”类型的值没有成员“withNewConnection”

不幸的是,Fluent 4 数据库标识符.mysql不再是通用的。因此,您必须request.db as! SQLDatabase始终像这样进行转换才能获取raw(...)执行原始查询之类的方法。现在,连接也已深入到引擎盖下。

我建议看看SwifQL + Bridges with Vapor 4

import Vapor
import MySQLBridge

struct MyResult: Codable {
    let column1: String
    let column2: Int
}
func someHandler(_ req: Request) throws -> EventLoopFuture<[MyResult]> {
    req.mysql.connection(to: .myDatabase) { conn in
        SwifQL
            .select(\SomeTable.$column1, \SomeTable.$column2)
            .from(SomeTable.table)
            .execute(on: conn)
            .all(decoding: MyResult.self)
    }
}
Run Code Online (Sandbox Code Playgroud)

SwifQL 是一种 DSL,使您能够安全地构建任何原始查询,而 Bridges 是数据库驱动程序的助手,mysql-nio因此postgres-nio它为它们提供了方便的方法。