簡體   English   中英

使用Vapor框架設置數據庫連接

[英]Setting up database connection using Vapor framework

我正在嘗試使用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
    }
}

我究竟做錯了什么?

正如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(path:“ runk-3.0-database”)方法,將在“派生數據”文件夾中創建具有指定名稱的數據庫文件。 如果該文件存在於“派生數據”文件夾中,則SQLiteDatabase會使用它。 因此,在清理構建文件夾時將擦除數據庫。

控制台會打印出“派生數據”的路徑,您可以在其中找到數據庫:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM