Kitura

APIDoc Build Status - Master macOS Linux Apache 2 Slack Status

SwiftKueryMySQL

用于 Swift-Kuery 框架的 MySQL 插件。它使您可以使用 Swift-Kuery 来操作 MySQL 数据库中的数据。

Swift 版本

最新版本的 SwiftKueryMySQL 需要 Swift 4.0 或更高版本。您可以通过此链接下载此版本的 Swift 二进制文件。不保证与其他 Swift 版本的兼容性。

安装 MySQL

macOS

brew install mysql
mysql.server start

Linux

sudo apt-get update
sudo apt-get install mysql-server libmysqlclient-dev pkg-config
sudo service mysql start

用法

在 macOS 上,可以使用常规的 swift 命令进行构建和测试。使用下面的示例命令来生成 Xcode 项目。

例如,

swift build
swift test
swift package generate-xcodeproj --xcconfig-overrides Config.xcconfig

在 Linux 上,如果您的 MySQL 安装是 5.7 或更高版本,标准 swift 命令也将有效。如果使用早期版本的 MySQL,请将 -Xcc -I/usr/include/mysql 添加到 swift 命令,以将编译器指向 MySQL 头文件。

例如,

swift build -Xcc -I/usr/include/mysql/
swift test -Xcc -I/usr/include/mysql/

添加依赖项

SwiftKueryMySQL 包添加到应用程序的 Package.swift 文件中的依赖项。 将 "x.x.x" 替换为最新的 SwiftKueryMySQL 发行版

.package(url: "https://github.com/IBM-Swift/SwiftKueryMySQL.git", from: "x.x.x")

SwiftKueryMySQL 添加到你的目标的依赖项中

.target(name: "example", dependencies: ["SwiftKueryMySQL"]),

导入包

import SwiftKueryMySQL

使用 SwiftKueryMySQL

通过调用以下代码创建 MySQLConnection 的实例

let connection = MySQLConnection(host: host, user: user, password: password, database: database,
                                 port: port, characterSet: characterSet)

其中

所有连接参数都是可选的,因此如果您以当前用户身份使用标准的本地 MySQL 服务器,则可以简单地使用

let connection = MySQLConnection(password: password)

password 也是可选的,但建议使用。

或者,调用

let connection = MySQLConnection(url: URL(string: "mysql://\(user):\(password)@\(host):\(port)/\(database)")!))

现在您有了一个连接,可用于执行使用 Swift-Kuery 创建的 SQL 查询。

要连接到服务器并执行查询

connection.connect() { result in
    guard result.success else {
        // Connection unsuccessful
        return
    }
    // Connection succesful
    // Use connection
    connection.execute(query: query) { queryResult in
      guard queryResult.success else {
          // Check for Error and handle
          return
      }
      // Process queryResult
   }
}

MySQLConnections 不应用于执行并发操作,因此不应在没有适当同步的情况下跨线程共享。 如果您希望在多个线程之间共享连接,建议使用连接池,因为连接池将确保您的连接不会被并发使用。

下面的示例创建一个包含单个连接的 ConnectionPool,并使用它在多个线程上执行插入操作

var connectionPoolOptions = ConnectionPoolOptions.init(initialCapacity: 1, maxCapacity: 1)
let connectionPool = MySQLConnection.createPool(host: host, user: user, password: password, database: database, port: port, characterSet: nil, connectionTimeout: 10000, poolOptions: connectionPoolOptions)
.......
let insertQuery = Insert(into: infos, values: "firstname", "surname", Parameter())
let insertGroup = DispatchGroup()
for age in 0 ... 5 {
    insertGroup.enter()
    connectionPool.getConnection() { connection, error in
        guard let connection = connection else {
            // Error Handling and return
        }
        connection.execute(query: insertQuery, parameters: [age]) { result in
            guard result.success else {
                // Error handling and return
            }
            print("Successfully inserted age: \(age)")
            return insertGroup.leave()
        }
    }
}
insertGroup.wait()

执行此示例代码时,您会看到类似于以下内容的输出

Successfully inserted age: 0
Successfully inserted age: 1
Successfully inserted age: 2
Successfully inserted age: 3
Successfully inserted age: 4
Successfully inserted age: 5

这是因为连接池只允许单个任务获取该连接。 因为连接池现在为空,所以其他任务将排队等待稍后执行。 随着每个任务完成,单个连接将返回到池中,然后调用下一个任务。

在上面的示例中,使用 DispatchGroup 暂停主线程,直到所有任务完成。 这是必要的,因为对 connectionPool.getConnection() 的调用会立即返回 - 任务会在稍后,在连接可用时调用。

如果增加线程池的容量,则插入的顺序将是不可预测的,因为它们能够在不同的连接上并发执行

Successfully inserted age: 0
Successfully inserted age: 1
Successfully inserted age: 3
Successfully inserted age: 2
Successfully inserted age: 5
Successfully inserted age: 4

查看 Swift-Kuery 文档,了解有关使用 Swift-Kuery 框架的详细信息。

用于测试目的 - MySQL 测试设置

要运行 swift test 以验证您的 MySQL 安装,您必须首先运行以下命令来设置您的 MySQL

mysql_upgrade -uroot || echo "No need to upgrade"
mysql -uroot -e "CREATE USER 'swift'@'localhost' IDENTIFIED BY 'kuery';"
mysql -uroot -e "CREATE DATABASE IF NOT EXISTS test;"
mysql -uroot -e "GRANT ALL ON test.* TO 'swift'@'localhost';"

API 文档

有关更多信息,请访问我们的 API 参考

社区

我们很乐意讨论服务器端 Swift 和 Kitura。 加入我们的 Slack 与团队见面!

通过 Cloud Foundry 部署

如果您在您使用 Cloud Foundry Swift 构建包部署的应用程序中将 SwiftKueryMySQL 作为依赖项包含,那么您需要在编译您的应用程序时指定一些额外的标志。 最好的方法是向您的应用程序的根目录添加一个名为 .swift-build-linux-options 的文件,内容如下:

$ cat .swift-build-options-linux 
-Xcc -I/usr/include/mysql/

这些标志告诉编译器在哪里找到构建 CMySQL 库所需的 MySQL 头文件。

许可证

此库是在 Apache 2.0 许可下发布的。 完整的许可证文本可在 LICENSE 中找到。