Symfoware

Symfowareについての考察blog

続:SwiftKueryMySQLを利用してMariaDBに接続

SwiftKueryMySQLを利用して、MariaDBに接続してみました。
Kitura SwiftKueryMySQLを利用してMariaDBに接続

簡単なselectを試しただけなので、データの登録なども試してみたいと思います。


プロジェクトの新規作成



復習も兼ねて、テスト用のプログラムを新規作成します。
実行可能プロジェクトの雛形を作成。


$ mkdir test
$ cd test/
$ swift package init --type executable
Creating executable package: test
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
Creating Tests/




Package.swiftに依存関係を追記。


  1. // swift-tools-version:3.1
  2. import PackageDescription
  3. let package = Package(
  4.     name: "test",
  5.     dependencies: [
  6.         .Package(url: "https://github.com/IBM-Swift/SwiftKueryMySQL.git", majorVersion: 0, minor: 13)
  7.     ]
  8. )





main.swiftに検索プログラムを記載


  1. import SwiftKuery
  2. import SwiftKueryMySQL
  3. // 検索するテーブルの定義
  4. class MyTable : Table {
  5.     let id = Column("id")
  6.     let value = Column("value")
  7.     let tableName = "test"
  8. }
  9. let t = MyTable()
  10. // 接続情報
  11. let connection = MySQLConnection(
  12.     host: "localhost",
  13.     user: "admin",
  14.     password: "P@ssw0rd",
  15.     database: "sample",
  16.     port: 3306,
  17.     characterSet: "utf8mb4"
  18. )
  19. connection.connect() { error in
  20.     
  21.     if let error = error {
  22.         print("Error \(error)")
  23.         return
  24.     }
  25.     // クエリー実行
  26.     let query = Select( t.id, t.value, from:t)
  27.                 .where( t.id == 1)
  28.     connection.execute(query: query) { queryResult in
  29.         if let resultSet = queryResult.asResultSet {
  30.             // 結果の取得
  31.             for row in resultSet.rows {
  32.                 for field in row {
  33.                     let val = field ?? ""
  34.                     print("\(val)")
  35.                 }
  36.             }
  37.         } else if let queryError = queryResult.asError {
  38.             print("queryError \(queryError)")
  39.         }
  40.     }
  41. }




ビルドと実行


$ swift build
$ .build/debug/test
1
test




これで前回までの処理に追いつきました。





フィールド名で値取得



ResultSetのtitlesにフィールド名が格納されています。
こんなコードで、[フィールド名:値]の辞書型に変換することができました。


  1. import SwiftKuery
  2. import SwiftKueryMySQL
  3. // 検索するテーブルの定義
  4. class MyTable : Table {
  5.     let id = Column("id")
  6.     let value = Column("value")
  7.     let tableName = "test"
  8. }
  9. func fetchRow(_ resultSet:ResultSet, _ row:[Any?]) -> [String:Any?] {
  10.     var dictRow = [String:Any?]();
  11.     for (i, title) in resultSet.titles.enumerated() {
  12.         dictRow[title] = row[i]
  13.     }
  14.     return dictRow
  15. }
  16. let t = MyTable()
  17. // 接続情報
  18. let connection = MySQLConnection(
  19.     host: "localhost",
  20.     user: "admin",
  21.     password: "P@ssw0rd",
  22.     database: "sample",
  23.     port: 3306,
  24.     characterSet: "utf8mb4"
  25. )
  26. connection.connect() { error in
  27.     
  28.     if let error = error {
  29.         print("Error \(error)")
  30.         return
  31.     }
  32.     // クエリー実行
  33.     let query = Select( t.id, t.value, from:t)
  34.                 .where( t.id == 1)
  35.     connection.execute(query: query) { queryResult in
  36.         if let resultSet = queryResult.asResultSet {
  37.             
  38.             // 結果の取得
  39.             for row in resultSet.rows {
  40.                 let dictRow = fetchRow(resultSet, row)
  41.                 print(dictRow["id"] as! Int32)
  42.                 print(dictRow["value"] as! String)
  43.             }
  44.         } else if let queryError = queryResult.asError {
  45.             print("queryError \(queryError)")
  46.         }
  47.     }
  48. }






Iterator



もう少しスマートにIteratorでループするようにしてみます。


  1. import SwiftKuery
  2. import SwiftKueryMySQL
  3. // 検索するテーブルの定義
  4. class MyTable : Table {
  5.     let id = Column("id")
  6.     let value = Column("value")
  7.     let tableName = "test"
  8. }
  9. func fetchRows(_ resultSet:ResultSet) -> AnyIterator<[String:Any?]> {
  10.     return AnyIterator<[String:Any?]> {
  11.         // 結果の取得
  12.         for row in resultSet.rows {
  13.             var dictRow = [String:Any?]()
  14.             for (i, title) in resultSet.titles.enumerated() {
  15.                 dictRow[title] = row[i]
  16.             }
  17.             return dictRow
  18.         }
  19.         return nil
  20.     }
  21. }
  22. let t = MyTable()
  23. // 接続情報
  24. let connection = MySQLConnection(
  25.     host: "localhost",
  26.     user: "admin",
  27.     password: "P@ssw0rd",
  28.     database: "sample",
  29.     port: 3306,
  30.     characterSet: "utf8mb4"
  31. )
  32. connection.connect() { error in
  33.     
  34.     if let error = error {
  35.         print("Error \(error)")
  36.         return
  37.     }
  38.     // クエリー実行
  39.     let query = Select( t.id, t.value, from:t)
  40.     connection.execute(query: query) { queryResult in
  41.         if let resultSet = queryResult.asResultSet {
  42.             let rows = fetchRows(resultSet)
  43.             while let row = rows.next() {
  44.                 print(row["id"] as! Int32)
  45.                 print(row["value"] as! String)
  46.             }
  47.         } else if let queryError = queryResult.asError {
  48.             print("queryError \(queryError)")
  49.         }
  50.     }
  51. }








Insert



データ登録のサンプルです。


  1. import SwiftKuery
  2. import SwiftKueryMySQL
  3. // 検索するテーブルの定義
  4. class MyTable : Table {
  5.     let id = Column("id")
  6.     let value = Column("value")
  7.     let tableName = "test"
  8. }
  9. let t = MyTable()
  10. // 接続情報
  11. let connection = MySQLConnection(
  12.     host: "localhost",
  13.     user: "admin",
  14.     password: "P@ssw0rd",
  15.     database: "sample",
  16.     port: 3306,
  17.     characterSet: "utf8mb4"
  18. )
  19. connection.connect() { error in
  20.     
  21.     if let error = error {
  22.         print("Error \(error)")
  23.         return
  24.     }
  25.     // クエリー実行
  26.     let query = Insert(into: t, rows: [[1, "apple"], [2, "apricot"], [4, "banana"]])
  27.     
  28.     connection.execute(query: query) { queryResult in
  29.         if let resultSet = queryResult.asResultSet {
  30.             print("query ok")
  31.         } else if let queryError = queryResult.asError {
  32.             print("queryError \(queryError)")
  33.         }
  34.     }
  35. }




実行後のテーブル


MariaDB [sample]> select * from test;
+------+---------+
| id | value |
+------+---------+
|    1 | apple |
|    2 | apricot |
|    4 | banana |
+------+---------+
3 rows in set (0.00 sec)







Update



データ更新のサンプルです。


  1. import SwiftKuery
  2. import SwiftKueryMySQL
  3. // 検索するテーブルの定義
  4. class MyTable : Table {
  5.     let id = Column("id")
  6.     let value = Column("value")
  7.     let tableName = "test"
  8. }
  9. let t = MyTable()
  10. // 接続情報
  11. let connection = MySQLConnection(
  12.     host: "localhost",
  13.     user: "admin",
  14.     password: "P@ssw0rd",
  15.     database: "sample",
  16.     port: 3306,
  17.     characterSet: "utf8mb4"
  18. )
  19. connection.connect() { error in
  20.     
  21.     if let error = error {
  22.         print("Error \(error)")
  23.         return
  24.     }
  25.     // クエリー実行
  26.     let query = Update(t, set: [(t.value, "apple-update")])
  27.                 .where(t.id == 1)
  28.     
  29.     connection.execute(query: query) { queryResult in
  30.         if let resultSet = queryResult.asResultSet {
  31.             print("query ok")
  32.         } else if let queryError = queryResult.asError {
  33.             print("queryError \(queryError)")
  34.         }
  35.     }
  36. }




MariaDB [sample]> select * from test;
+------+--------------+
| id | value        |
+------+--------------+
|    1 | apple-update |
|    2 | apricot     |
|    4 | banana     |
+------+--------------+
3 rows in set (0.00 sec)







Delete



削除のサンプルです。


  1. import SwiftKuery
  2. import SwiftKueryMySQL
  3. // 検索するテーブルの定義
  4. class MyTable : Table {
  5.     let id = Column("id")
  6.     let value = Column("value")
  7.     let tableName = "test"
  8. }
  9. let t = MyTable()
  10. // 接続情報
  11. let connection = MySQLConnection(
  12.     host: "localhost",
  13.     user: "admin",
  14.     password: "P@ssw0rd",
  15.     database: "sample",
  16.     port: 3306,
  17.     characterSet: "utf8mb4"
  18. )
  19. connection.connect() { error in
  20.     
  21.     if let error = error {
  22.         print("Error \(error)")
  23.         return
  24.     }
  25.     // クエリー実行
  26.     let query = Delete(from: t)
  27.                 .where(t.id == 1)
  28.     
  29.     connection.execute(query: query) { queryResult in
  30.         if let resultSet = queryResult.asResultSet {
  31.             print("query ok")
  32.         } else if let queryError = queryResult.asError {
  33.             print("queryError \(queryError)")
  34.         }
  35.     }
  36. }




MariaDB [sample]> select * from test;
+------+---------+
| id | value |
+------+---------+
|    2 | apricot |
|    4 | banana |
+------+---------+
2 rows in set (0.00 sec)









【参考URL】

Swiftでのenumerateの使い方
Explain Swift Iterators


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/08/28(月) 00:10:07|
  2. swift
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ