【问题标题】:Setting up database connection using Vapor framework使用 Vapor 框架建立数据库连接
【发布时间】:2019-03-04 02:14:45
【问题描述】:

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

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

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

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

/Users/rutgerhuijsmans/Documents/runk-3.0

我的数据库叫runk-3.0-database

文件夹如下所示:

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

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

我做错了什么?

【问题讨论】:

    标签: swift sqlite vapor


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      控制台打印出导出数据的路径,您可以在其中找到数据库:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-05
        • 2014-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-15
        • 1970-01-01
        • 2016-03-11
        相关资源
        最近更新 更多