Не могу подключить мою базу данных MySQL в проекте Vapor - PullRequest
0 голосов
/ 16 января 2019

Я новичок в Vapor и хотел попробовать подключить свою базу данных MySQL. Я нашел в официальной документации, как это сделать, но при попытке отправить запрос выдает ошибку:

No services are available for 'DatabaseConnectionPoolCache'. (Container.swift:112)

Я просто скопировал и вставил код из документации, и он не работает. Может ли кто-нибудь помочь мне узнать почему?

У меня MySQL@5.7 на Мохаве . На самом деле простые запросы работают хорошо, например:

router.get("hey") { req in
    return "Stas, hey"
}

Код в файле configure.swift:

import FluentSQLite
import MySQL
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())
    try services.register(MySQLProvider())

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

    // Configure a SQLite database
    let sqlite = try SQLiteDatabase(storage: .memory)

    /// 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: Todo.self, database: .sqlite)
    services.register(migrations)

    //Configure a MySQL database
    let mysql = try MySQLDatabase(config: MySQLDatabaseConfig(
        hostname: "127.0.0.1",
        port: 3306,
        username: "root",
        password: "7374",
        database: "WORK_TIME"))

    ///Register to the congig
    var mysqlDatabases = DatabasesConfig()
    mysqlDatabases.add(database: mysql, as: .mysql)
    services.register(mysqlDatabases) 
}

Мой запрос в main.swift:

public struct MySQLVersion: Codable {
    let version: String
}

router.get("sql") { req in
    return req.withPooledConnection(to: .mysql) {conn in
        return conn.raw("SELECT @@version as version")
            .all(decoding: MySQLVersion.self)
        }.map { rows in
            return rows[0].version
    }
}

Должен возвращать версию MySQL, но выдает странную ошибку.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Чтобы решить эту проблему, вы должны избавиться от всех остатков SQLite из исходного проекта и написать свои маршруты в routes.swift

0 голосов
/ 16 января 2019

Ваша проблема в том, что в исходном шаблоне проекта есть кое-что из SQLite.

Начните с удаления зависимости fluent-sqlite из файла Package.swift и цели FluentSQLite из любых зависимостей назначения. Затем запустите swift package updatevapor xcode, если вы используете Xcode) в своем терминале.

Теперь, когда вы удалили зависимость FluentSQLite из своего проекта, вы должны быть в состоянии следовать ошибкам компилятора, чтобы исправить вашу проблему. Вот те, которые я нашел:


import FluentSQLite
import MySQL

Должно быть:

import FluentMySQL

try services.register(FluentSQLiteProvider())
try services.register(MySQLProvider())

Должно быть

try services.register(FluentMySQLProvider())

Удалите это, так как вы используете MySQL вместо SQLite:

// Configure a SQLite database
let sqlite = try SQLiteDatabase(storage: .memory)

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

migrations.add(model: Todo.self, database: .sqlite)

Должно быть

migrations.add(model: Todo.self, database: .mysql)

Я думаю, что это охватывает все. Ваш /sql маршрут должен работать.

...