是否可以在独立脚本中使用 Vapor 3 Postgres Fluent?

Kir*_*rby 5 swift vapor

我正在试验一个独立的脚本,该脚本将使用 Vapor 和 Fluent 查询 Postgres 数据库。在普通的 Vapor API 应用程序中,这只需通过以下方式完成:

router.get("products") { request in
    return Product.query(on: request).all()
}
Run Code Online (Sandbox Code Playgroud)

然而,在一个独立的脚本中,由于没有“请求”,我陷入了用什么来替换“请求”的问题DatabaseConnectable上。这是我陷入困境的地方:

import Fluent
import FluentPostgreSQL

let databaseConfig = PostgreSQLDatabaseConfig(hostname: "localhost",
                                              username: "test",
                                              database: "test",
                                              password: nil)

let database = PostgreSQLDatabase(config: databaseConfig)

let foo = Product.query(on: <??WhatDoIPutHere??>)
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个符合 的对象DatabaseConnectable,但无法弄清楚如何正确地使该对象符合 。

Cal*_*ter 1

您将需要创建一个事件循环组才能发出数据库请求。SwiftNIOMultiThreadedEventLoopGroup对此很有用:

let worker = MultiThreadedEventLoopGroup(numberOfThreads: 2)
Run Code Online (Sandbox Code Playgroud)

您可以根据需要更改使用的线程数。

现在您可以使用该工作程序创建与数据库的连接:

let conn = try database.newConnection(on: worker)
Run Code Online (Sandbox Code Playgroud)

连接是未来的,因此您可以map在查询中传递连接:

conn.flatMap { connection in
    return Product.query(on: connection)...
}
Run Code Online (Sandbox Code Playgroud)

确保在完成工作后关闭工作程序shutdownGracefully(queue:_:)