Vapor 4 PostgreSQL CRUD without http requests



我正在使用 Swift 5 和 Vapor 4 编写后端,数据库是 PostgreSQL 12。我有一个问题:如何在没有 POST 或 GET 请求的情况下在本地与数据库 (CRUD( 交互?所有教程都展示了如何仅基于再次通过HTTPS的请求进行CRUD。我已经问过这个问题:Vapor 3 PostgreSQL CRUD 没有请求 http 但这不是一个重复的问题,Vapor 4 的工作方式完全不同!请看一下我目前的 Vapor 3 工人阶级(基于这个答案:是否可以在独立脚本中使用 Vapor 3 Postgres Fluent?

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)
}
}
}

}

最大的问题:我找不到FluentPostgresDriverFluent的替代品来PostgreSQLDatabase。 或者,也许应该是解决此任务的另一种方法?

感谢您的阅读,我将感谢您的任何帮助或建议!

所以,不要像使用 Vapor 3 那样使用数据库的正确想法。现在,在 Vapor 4 中,您应该使用Database实例。从哪里得到它?我可以为您推荐 2 个选项。首先是在boot.swiftboot(_ app: Application),或者在configure.swiftconfigure(_ app: Application)中。因此,app将可以选择使用这样的数据库:<Model>.query(on: app.db).第二个选项是在任何请求中reqreq应该是Request型,像这样:<Model>.query(on: req.db)。通过Model,你可以采用类Model继承的任何类,例如:final class User: Model, Content {你应该组织你的代码,从boot.swiftconfigure.swift或任何请求调用,例如,在routes.swift

Fluent 4 中没有连接这样的东西 - 你可以只使用database类型。所以你的model.save(on:)变得model.save(on: database)

最新更新