使用Vapor框架设置数据库连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Vapor框架设置数据库连接相关的知识,希望对你有一定的参考价值。

我正在尝试使用Swift构建API,我选择使用Vapor。

我已经创建了一个SQLite数据库,并且能够使用数据库客户端连接到它。

现在我希望我的Swift Vapor项目也可以使用FluentSQLite包连接到它。

我在项目的根文件夹中创建了我的数据库:

/Users/rutgerhuijsmans/Documents/runk-3.0

我的数据库名为runk-3.0-database

该文件夹如下所示:

enter image description here

我尝试使用以下配置连接到我的数据库:

import FluentSQLite
import Vapor

/// Called before your application initializes.
public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws {
    /// Register providers first
    try services.register(FluentSQLiteProvider())

    /// Register routes to the router
    let router = EngineRouter.default()
    try routes(router)
    services.register(router, as: Router.self)

    /// Register middleware
    var middlewares = MiddlewareConfig() // Create _empty_ middleware config
    /// middlewares.use(FileMiddleware.self) // Serves files from `Public/` directory
    middlewares.use(ErrorMiddleware.self) // Catches errors and converts to HTTP response
    services.register(middlewares)

    let sqlite: SQLiteDatabase?
    do {
        sqlite = try SQLiteDatabase(storage: .file(path: "runk-3.0-database"))
        print("data base connected") // This gets printed

        /// Register the configured SQLite database to the database config.
        var databases = DatabasesConfig()
        databases.add(database: sqlite!, as: .sqlite)
        services.register(databases)

        /// Configure migrations
        var migrations = MigrationConfig()
        migrations.add(model: User.self, database: .sqlite)
        services.register(migrations)
    } catch {
        print("couldn't connect") // This doesn't get printed
    }
}

我究竟做错了什么?

答案

正如IMike17所解释的那样,您的代码只是将新的DB文件创建到Build / Products / Debug或release文件夹中。您必须动态设置完整路径,如下所示:

do {
let directory = DirectoryConfig.detect()
let filePath = directory.workDir + "runk-3.0-database"
sqlite = try SQLiteDatabase(storage: .file(path: filePath)) 
......
另一答案

使用.file(路径:“runk-3.0-database”)方法,如果仅指定名称,则在“派生数据”文件夹中创建具有指定名称的数据库文件。如果该文件存在于Derived Data文件夹中,则SQLiteDatabase将使用该文件。因此在清理构建文件夹时会删除数据库。

控制台打印出Derived Data的路径,您可以在其中找到DB:

Running default command: /Users/username/Library/Developer/Xcode/DerivedData/SQLiteDB-xxxxxxxxxxxxxxxxxxxxxxx/Build/Products/Debug/

如果在项目中使用DB的完整路径,则使用该文件。按如下方式更改您的init方法,您应该适合本地环境:

sqlite = try SQLiteDatabase(storage: .file(path: "/Users/rutgerhuijsmans/Documents/runk-3.0/runk-3.0-database"))

以上是关于使用Vapor框架设置数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

对 Vapor Web 框架进行基准测试时出现邮箱完全错误

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

无法在 Vapor 项目中连接我的 MySQL 数据库

使用Swift4+Vapor写后端-初体验

国内首个完整的 Swift 服务端开源项目及详解 - 基于 Vapor 3 框架

使用不同的数据库提供程序测试 Vapor 3