Настройка подключения к базе данных с использованием Vapor Framework
Я пытаюсь создавать API с использованием Swift, и я решил использовать Vapor.
Я создал базу данных SQLite и могу подключиться к ней с помощью клиента БД.
Теперь я хочу, чтобы мой проект 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
}
}
Что я делаю неправильно?
2 ответа
Как объяснил 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))
......
Используя метод.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"))