Настройка подключения к базе данных с использованием Vapor Framework - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь создавать API, используя Swift, и я решил использовать 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
    }
}

Что я делаюнеправильно?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Как объяснил IMike17, ваш код просто создает новый файл БД в папке Build / Products / Debug или release.Вы должны установить полный путь динамически, как показано ниже:

do {
let directory = DirectoryConfig.detect()
let filePath = directory.workDir + "runk-3.0-database"
sqlite = try SQLiteDatabase(storage: .file(path: filePath)) 
......
0 голосов
/ 28 сентября 2018

Используя .file (путь: «runk-3.0-database»), метод, если указать только имя, создает файл базы данных с указанным именем в папке «Производные данные».Если файл существует в папке «Производные данные», SQLiteDatabase его использует.Таким образом, при очистке папки сборки БД стирается.

Консоль выводит путь к производным данным, где вы можете найти БД:

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

Есливы используете полный путь к БД в вашем проекте, затем файл используется.Измените ваш метод инициализации следующим образом, и вы должны хорошо ориентироваться в локальной среде:

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

...