没有 http 请求的 Vapor 4 PostgreSQL CRUD
Vapor 4 PostgreSQL CRUD without http requests
我正在使用 Swift 5 和 Vapor 4 编写后端,数据库是 PostgreSQL 12。我有一个问题:如何在没有 POST 或 GET 请求的情况下与本地数据库 (CRUD) 交互?所有教程都展示了如何再次通过 HTTPS 仅基于 Request 进行增删改查。我已经问过这个问题了:
但这不是一个重复的问题,Vapor 4 的工作方式完全不同!请查看我目前为 Vapor 3 工作的 class(基于此答案:):
import Vapor
import FluentPostgreSQL
final class WorkWithPostgres {
private let databaseConfig = PostgreSQLDatabaseConfig(hostname: "localhost", port: 5432, username: "RutrackerTech", database: "vaporpostgres", password: "ru628trac4er")
let postgres: PostgreSQLDatabase
static let shared = WorkWithPostgres()
private init() {
postgres = PostgreSQLDatabase(config: databaseConfig)
}
/// Will it create undeleted memory leaks?
func shutdownGracefully(worker: MultiThreadedEventLoopGroup, completion: (() -> Void)?) {
worker.shutdownGracefully { error in
completion?()
}
}
/// Will it create udeleted memory leaks?
func connect(completion: ((MultiThreadedEventLoopGroup, PostgreSQLConnection) -> Void)?) {
let worker = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let eventLoopFuturePostgreSQLConnection = postgres.newConnection(on: worker)
let _ = eventLoopFuturePostgreSQLConnection.map { postgreSQLConnection in
completion?(worker, postgreSQLConnection)
}
}
func readAll<T: PostgreSQLModel>(postgreSQLModel: T.Type, completion: (([T]) -> Void)?) {
connect { worker, connection in
let _ = postgreSQLModel.query(on: connection).all().map { databaseData in
self.shutdownGracefully(worker: worker) {
completion?(databaseData)
}
}
}
}
func create<T: PostgreSQLModel>(postgreSQLModel: T) {
connect { worker, connection in
let _ = postgreSQLModel.save(on: connection).whenComplete {
self.shutdownGracefully(worker: worker, completion: nil)
}
}
}
}
最大的问题:我无法在 FluentPostgresDriver
或 Fluent
中找到 PostgreSQLDatabase
的替代品。
或者,也许,应该是解决此任务的另一种方法?
感谢您的阅读,如有任何帮助或建议,我将不胜感激!
Fluent 4 中没有连接这样的东西 - 您可以只使用 database
类型。所以你的 model.save(on:)
变成 model.save(on: database)
所以,不要像我使用 Vapor 3 那样使用数据库是正确的想法。现在,在 Vapor 4 中,您应该使用 Database
实例。从哪里得到它?我可以为您推荐 2 个选项。首先是 boot.swift
中的 boot(_ app: Application)
或 configure.swift
中的 configure(_ app: Application)
。所以 app
将有像这样使用数据库的选项:<Model>.query(on: app.db)
。第二个选项是 req
在任何请求中。 req
应该是 Request
类型,像这样:<Model>.query(on: req.db)
。通过 Model
,您可以采用继承自 class Model
的任何 class,例如:final class User: Model, Content {
您应该组织要从 [=12= 调用的代码] 或 configure.swift
或来自任何请求,例如 routes.swift
我正在使用 Swift 5 和 Vapor 4 编写后端,数据库是 PostgreSQL 12。我有一个问题:如何在没有 POST 或 GET 请求的情况下与本地数据库 (CRUD) 交互?所有教程都展示了如何再次通过 HTTPS 仅基于 Request 进行增删改查。我已经问过这个问题了:
import Vapor
import FluentPostgreSQL
final class WorkWithPostgres {
private let databaseConfig = PostgreSQLDatabaseConfig(hostname: "localhost", port: 5432, username: "RutrackerTech", database: "vaporpostgres", password: "ru628trac4er")
let postgres: PostgreSQLDatabase
static let shared = WorkWithPostgres()
private init() {
postgres = PostgreSQLDatabase(config: databaseConfig)
}
/// Will it create undeleted memory leaks?
func shutdownGracefully(worker: MultiThreadedEventLoopGroup, completion: (() -> Void)?) {
worker.shutdownGracefully { error in
completion?()
}
}
/// Will it create udeleted memory leaks?
func connect(completion: ((MultiThreadedEventLoopGroup, PostgreSQLConnection) -> Void)?) {
let worker = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let eventLoopFuturePostgreSQLConnection = postgres.newConnection(on: worker)
let _ = eventLoopFuturePostgreSQLConnection.map { postgreSQLConnection in
completion?(worker, postgreSQLConnection)
}
}
func readAll<T: PostgreSQLModel>(postgreSQLModel: T.Type, completion: (([T]) -> Void)?) {
connect { worker, connection in
let _ = postgreSQLModel.query(on: connection).all().map { databaseData in
self.shutdownGracefully(worker: worker) {
completion?(databaseData)
}
}
}
}
func create<T: PostgreSQLModel>(postgreSQLModel: T) {
connect { worker, connection in
let _ = postgreSQLModel.save(on: connection).whenComplete {
self.shutdownGracefully(worker: worker, completion: nil)
}
}
}
}
最大的问题:我无法在 FluentPostgresDriver
或 Fluent
中找到 PostgreSQLDatabase
的替代品。
或者,也许,应该是解决此任务的另一种方法?
感谢您的阅读,如有任何帮助或建议,我将不胜感激!
Fluent 4 中没有连接这样的东西 - 您可以只使用 database
类型。所以你的 model.save(on:)
变成 model.save(on: database)
所以,不要像我使用 Vapor 3 那样使用数据库是正确的想法。现在,在 Vapor 4 中,您应该使用 Database
实例。从哪里得到它?我可以为您推荐 2 个选项。首先是 boot.swift
中的 boot(_ app: Application)
或 configure.swift
中的 configure(_ app: Application)
。所以 app
将有像这样使用数据库的选项:<Model>.query(on: app.db)
。第二个选项是 req
在任何请求中。 req
应该是 Request
类型,像这样:<Model>.query(on: req.db)
。通过 Model
,您可以采用继承自 class Model
的任何 class,例如:final class User: Model, Content {
您应该组织要从 [=12= 调用的代码] 或 configure.swift
或来自任何请求,例如 routes.swift