【问题标题】:Vapor 4 PostgreSQL CRUD without http requests没有 http 请求的 Vapor 4 PostgreSQL CRUD
【发布时间】:2020-10-15 00:51:56
【问题描述】:

我正在使用 Swift 5 和 Vapor 4 编写后端,数据库是 PostgreSQL 12。我有一个问题:如何在本地与数据库 (CRUD) 交互,而无需 POST 或 GET 请求?所有教程都展示了如何再次通过 HTTPS 仅基于请求进行 CRUD。我已经问过这个问题:Vapor 3 PostgreSQL CRUD without requests http 但这不是一个重复的问题,Vapor 4 的工作方式完全不同!请看一下我目前的 Vapor 3 工人班(基于此答案:Is is possible to use Vapor 3 Postgres Fluent in a standalone script?):

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 的替代品。 或者,也许应该是解决此任务的另一种方法?

感谢您的阅读,如有任何帮助或建议,我将不胜感激!

【问题讨论】:

    标签: xcode postgresql vapor swift5.2 vapor-fluent


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好的,我将把“数据库”带到哪里?
      • “获取数据库”是什么意思?您已经在该代码中拥有它let postgres: PostgreSQLDatabase
      • PostgreSQLDatabase - 在 Vapor 4 中不再可用。
      • 您可以从ApplicationRequest 获取数据库 - 无论您在哪里使用它,都可以访问其中一个
      • 假设,我不想在里面使用Request(我不会向自己的localhost服务器发送请求),我应该一直使用Application吗?
      猜你喜欢
      • 2019-01-23
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      相关资源
      最近更新 更多