在 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 中有一个函数可以让我获得新连接或运行原始查询。
尝试这个:
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 查询!
错误:无法推断引用成员“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它为它们提供了方便的方法。
| 归档时间: |
|
| 查看次数: |
736 次 |
| 最近记录: |