Swift 3.0を使用してMySQLデータベースを操作します
開始
このチュートリアルでは、Ubuntu 16.04 システムと MySQL 5.7 を使用します。 MySQL 5.7 には一連の新機能が導入されています。その 1 つは、JSON データをより効率的に保存する機能を提供すると同時に、JSON データの内部をクエリする機能を提供することです。その後、MySQL 5.7 が Ubuntu 16.04 のデフォルトの MySQL バージョンになった場合、Ubuntu 16.04 をオペレーティング システムとして使用します。
Swift をまだインストールしていない場合は、apt-get を使用してインストールできます。インストール手順については、この記事を参照してください。 2016 年 9 月末、Apple は Ubuntu 16.04 上で Swift イメージのコンパイルも開始しました。詳細については、Swift.org をご覧ください。
データベースの作成
データベースに swift_test という名前を付け、割り当てられたユーザーは swift、パスワードは swiftpass です。MySQL に精通している場合は、認可のために GRANT ALL ON swift_test.* を実行する必要があることがわかるはずです。
この部分のコマンドは次のとおりです:
# sudo mysql ... mysql> create user swift; Query OK, 0 rows affected (0.00 sec) mysql> create database swift_test; Query OK, 1 row affected (0.00 sec) mysql> grant all on swift_test.* to 'swift'@'localhost' identified by 'swiftpass'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> quit Bye
Swift パッケージを作成します
ここで正式なコーディングを開始し、最初にパッケージを作成します:
# mkdir swift_mysql # swift package init --type executable
Package.swift ファイルを作成します:
import PackageDescription let package = Package( name: "swift_mysql", dependencies:[ .Package(url:"https://github.com/vapor/mysql", majorVersion:1) ] )
2 番目のステップでは、次を使用します。補助ツール コード ランダム データを生成し、データベースに入力します。 Sources ディレクトリの下に utils.swift ファイルを追加し、その中に次のコンテンツを追加します:
import Glibc class Random { static let initialize:Void = { srandom(UInt32(time(nil))) return () }() } func randomString(ofLength length:Int) -> String { Random.initialize let charactersString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" let charactersArray:[Character] = Array(charactersString.characters) var string = "" for _ in 0..<length { string.append(charactersArray[Int(random()) % charactersArray.count]) } return string } func randomInt() -> Int { Random.initialize return Int(random() % 10000) }
Vapor MySQL
次に実際のコードが来ます。main.swift ファイルは Vapor MySQL モジュールを使用します。
データベースに接続します
次のコードを Sources/main.swift に追加します:
import Glibc import MySQL var mysql:Database do { mysql = try Database(host:"localhost", user:"swift", password:"swiftpass", database:"swift_test") try mysql.execute("SELECT @@version") } catch { print("Unable to connect to MySQL: \(error)") exit(-1) }
上記のコードはデータベースを設定し、mysql を処理します。コンストラクター Database(host:String、user:String、password:String、database:String) は一目瞭然です。
ステートメント try mysql.execute("SELECT @@version") は、データベースに正しく接続され、正常に接続されていることを確認するテストに使用されます。 do コード ブロックがエラーなく実行されれば、データベースの操作を開始できます。
整数と文字列
MySQL へのすべての呼び出しは、execute(_:String) メソッドを経由します。このメソッドは、.create(table:String, ...) や .insert(table:String, ....execute などの一部の抽象 API メソッドとは異なることに注意してください。元の SQL ステートメントを取得して、それを .exe に渡します。 MySQL コネクター
do { try mysql.execute("DROP TABLE IF EXISTS foo") try mysql.execute("CREATE TABLE foo (bar INT(4), baz VARCHAR(16))") for i in 1...10 { let int = randomInt() let string = randomString(ofLength:16) try mysql.execute("INSERT INTO foo VALUES (\(int), '\(string)')") } // Query let results = try mysql.execute("SELECT * FROM foo") for result in results { if let bar = result["bar"]?.int, let baz = result["baz"]?.string { print("\(bar)\t\(baz)") } } } catch { print("Error: \(error)") exit(-1) }
クエリ結果もexecute(_:String) メソッドを使用しますが、返される結果は [String:Node] ディクショナリです。ディクショナリのキーはデータベースの列名に対応します。
Node 类型是 Vapor 中的数据结构,用于转化为不同的类型。你可以从这里获取更多的信息。使用 Node 类型来表达 MySQL 可以方便的转换成对应的 Swift 类型。比如:let bar = result["bar"]?.int 给我们一个整型。
继续
接着我们来看一些更复杂的例子,比如创建一个表,包含了 MySQL 的 DATE, POINT 和 JSON 数据类型。我们的表名叫 samples。
do { try mysql.execute("DROP TABLE IF EXISTS samples") try mysql.execute("CREATE TABLE samples (id INT PRIMARY KEY AUTO_INCREMENT, created_at DATETIME, location POINT, reading JSON)") // ... Date // ... Point // ... Sample // ... Insert // ... Query } catch { print("Error: \(error)") exit(-1) }
要插入一个日期到数据库中,需要正确的 SQL 语句:
// ... Date let now = Date() let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" // MySQL will accept this format let created_at = formatter.string(from:date)
接下来使用 Swift 元组来创建一个 POINT:
// ... Point let location = (37.20262, -112.98785) // latitude, longitude
最后,我们来处理 MySQL 5.7 中新的 JSON 数据类型,此外我们使用了 Jay 包来快速将一个 Swift 字典 [String:Any] 转换为 JSON 格式的字符串。
// ... Sample let sample:[String:Any] = [ "heading":90, "gps":[ "latitude":37.20262, "longitude":-112.98785 ], "speed":82, "temperature":200 ]
提示:你不需要显式在 Package.swift 中声明对 Jay 的依赖,因为在 MySQL 的包中已经包含了这个依赖。接下来我们把 JSON 数据转换为 String,用来拼凑 MySQL 语句。
let sampleData = try Jay(formatting:.minified).dataFromJson(any:sample) // [UInt8] let sampleJSON = String(data:Data(sampleData), encoding:.utf8)
这样我们就有了 date, point 和 JSON 字符串(sample) 了, 现在添加数据到 sample 表中:
// ... Insert let stmt = "INSERT INTO samples (created_at, location, sample) VALUES ('\(created_at)', POINT\(point), '\(sampleJSON)')" try mysql.execute(stmt)
请注意我们在处理 POINT 时候,使用了一些技巧。在对 (point) 展开为字符串 (37.20262, -112.98785) 后,完整的字符串是 POINT(37.20262, -112.98785),这是 MySQL 所需要的数据,整个语句的字符串如下:
INSERT INTO samples (created_at, location, sample) VALUES ('2016-09-21 22:28:44', POINT(37.202620000000003, -112.98784999999999), '{"gps":{"latitude":37.20262,"longitude":-112.98785},"heading":90,"speed":82,"temperature":200}')
获取结果
警告:在写这篇文章的时候(2016-09-22), Vapor MySQL 1.0.0 有一个 bug:在读取 POINT 数据类型时会 crash 掉,所以不得不在下面代码中加入 do 代码块,然后不使用 select 语句。我们在 Vapor MySQL 中记录了这个 issue,等这个 issue 修复以后,我们将更新文章。
在下面的例子中,我们将使用 MySQL 5.7 中引入对 JSON 数据内部的查询特性,使用 SELECT … WHERE 查询 JSON 数据。在这里查询的是 samples 表中 JSON 数据类型 sample中、speed 字段大于 80 的数据。
// ... 查询 let results = try mysql.execute("SELECT created_at,sample FROM samples where JSON_EXTRACT(sample, '$.speed') > 80") for result in results { if let sample = result["sample"]?.object, let speed = sample["speed"]?.int, let temperature = sample["temperature"]?.int, let created_at = result["created_at"]?.string { print("Time:\(created_at)\tSpeed:\(speed)\tTemperature:\(temperature)") } }
这里做一些说明。JSON_EXTRACT 函数是用来 返回从 JSON 文档中的数据,根据传入的路径参数选择文档中满足条件的数据。在本例中,我们解包了列 sample 中的 speed 值。
为了循环处理结果,我们使用了 for result in results 语句,接着使用 if let 语句验证结果数据。首先使用 let sample = result["sample"]?.object 获取一个字典,对应 MySQL 中的 JSON 文档,这是一句关键的代码!Vapor MySQL 库并没有返回一个 String,而 String 还需进行 JSON 的解析。这个解析工作库已经帮你做了,所以你可以直接使用 sample 字典啦。
剩下的 let 语句给了我们 speed,temperature 和 created_at。注意 created_at 在 MySQL 中是 DATETIME 类型,我们读取它为字符串。为了在 Swift 中转换成 Date 类型,需要使用 .date(from:String) 方法加一个 DateFormatter 来做类型转换。
获取代码
如果你想直接运行代码,请到 github 上下载我们的代码。
在任何地方使用 swift build 进行编译,运行可执行代码,不要忘了你还需要拥有一个数据库,用户名并且授权通过。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック







