gpt4 book ai didi

swift - 无法在 Vapor 项目中连接我的 MySQL 数据库

转载 作者:搜寻专家 更新时间:2023-11-01 06:26:14 25 4
gpt4 key购买 nike

我是 Vapor 的新手,我想尝试连接我的 MySQL 数据库。我在官方文档中找到了如何执行此操作,但是当我尝试发送查询时它会引发错误:

“DatabaseConnectionPoolCache”没有可用的服务。 (Container.swift:112)

我只是从文档中复制粘贴代码,但它不起作用。谁能帮我找出原因?

我在 Mojave 上安装了 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 的版本,但它抛出了一个奇怪的错误。

最佳答案

您的问题是原始项目模板中有一些遗留的 SQLite 内容。

首先从您的 Package.swift 文件中删除 fluent-sqlite 依赖项,并从任何目标依赖项中删除 FluentSQLite 目标。然后在您的终端中运行 swift package update(如果您使用 Xcode,则运行 vapor 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 路由现在应该可以工作了。

关于swift - 无法在 Vapor 项目中连接我的 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54213302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com