99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

使用 Swift 3.0 操作 MySQL 數(shù)據(jù)庫

發(fā)布時間:2016-10-22 22:22  回復(fù):0  查看:2169   最后回復(fù):2016-10-22 22:22  

在這篇swift教程中,我們采用 Ubuntu 16.04 系統(tǒng)和 MySQL 5.7。MySQL 5.7 引入了一系列的新特性。其中一個就是提供了更加高效的存儲 JSON 數(shù)據(jù)的能力,同時提供了查詢 JSON 數(shù)據(jù)內(nèi)部的能力。稍后如果 MySQL 5.7 成為了 Ubuntu 16.04 上默認的 MySQL 版本以后,我們將使用 Ubuntu 16.04 作為我們的操作系統(tǒng)。

  如果你還沒有安裝 Swift, 你可以使用 apt-get 方式來安裝。2016  9 月底,蘋果也開始在Ubuntu16.04 上編譯 Swift 的鏡像。請查看 Swift.org 獲取更多的信息。

  創(chuàng)建數(shù)據(jù)庫

  我們把數(shù)據(jù)庫命名為 swift_test , 分配的用戶是 swift , 密碼是 swiftpass ,如果你熟悉 MySQL,你應(yīng)該知道需要執(zhí)行 GRANT ALL ON swift_test.* 進行授權(quán)。

  下面是這部分的命令:

  # 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

  創(chuàng)建 Swift 

  現(xiàn)在開始正式進行編碼,首先創(chuàng)建一個包:

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

  ]

  )

  第二步,我們使用一些輔助的工具代碼來生成一些隨機的數(shù)據(jù),填充到數(shù)據(jù)庫中。

  在 Sources 目錄下添加 utils.swift 文件并在里面添加以下內(nèi)容:

  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..<</span>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 模塊。

  連接數(shù)據(jù)庫

  添加以下代碼到 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)

  }

  以上代碼設(shè)置數(shù)據(jù)庫并且處理 mysql。構(gòu)造器 Database(host:String, user:String, password:String, database:String) 一目了然。

  語句 try mysql.execute("SELECT @@version”) 是用來測試保證我們連接正確,并成功連接到了數(shù)據(jù)庫。如果 do 代碼塊運行無錯誤,接下來就可以開始操作數(shù)據(jù)庫了!

  整型和字符串

  所有對 MySQL 的調(diào)用都將通過 execute(_:String) 方法。需要注意的是該方法和一些抽象 API 的方法不同,比如 .create(table:String, ...) 或者 .insert(table:String, …  execute 獲取原始的 SQL 語句并傳給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)

  }

  查詢結(jié)果也是使用的 execute(_:String) 方法。但是返回的結(jié)果是一個 [String:Node] 字典。字典的 key對應(yīng)著數(shù)據(jù)庫的列名。

  Node 類型是 Vapor 中的數(shù)據(jù)結(jié)構(gòu),用于轉(zhuǎn)化為不同的類型。你可以從 這里 獲取更多的信息。使用 Node 類型來表達 MySQL 可以方便的轉(zhuǎn)換成對應(yīng)的 Swift 類型。比如: let bar = result["bar"]?.int 給我們一個整型。

  繼續(xù)

  接著我們來看一些更復(fù)雜的例子,比如創(chuàng)建一個表,包含了 MySQL  DATE, POINT  JSON 數(shù)據(jù)類型。我們的表名叫 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)

  }

  要插入一個日期到數(shù)據(jù)庫中,需要正確的 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 元組來創(chuàng)建一個 POINT 

  // ... Point

  let location = (37.20262, -112.98785) // latitude, longitude

  最后,我們來處理 MySQL 5.7 中新的 JSON 數(shù)據(jù)類型,此外我們使用了 Jay 包來快速將一個 Swift字典 [String:Any] 轉(zhuǎn)換為 JSON 格式的字符串。

  // ... Sample

  let sample:[String:Any] = [

  "heading":90,

  "gps":[

  "latitude":37.20262,

  "longitude":-112.98785

  ],

  "speed":82,

  "temperature":200

  ]

  提示:你不需要顯式在 Package.swift 中聲明對 Jay 的依賴,因為在 MySQL 的包中已經(jīng)包含了這個依賴。

  接下來我們把 JSON 數(shù)據(jù)轉(zhuǎn)換為 String,用來拼湊 MySQL 語句。

  let sampleData = try Jay(formatting:.minified).dataFromJson(any:sample) // [UInt8]

  let sampleJSON = String(data:Data(sampleData), encoding:.utf8)

  這樣我們就有了 date point  JSON 字符串(sample) 了, 現(xiàn)在添加數(shù)據(jù)到 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 所需要的數(shù)據(jù),整個語句的字符串如下:

  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}')

  獲取結(jié)果

  警告:在寫這篇文章的時候(2016-09-22), Vapor MySQL 1.0.0 有一個 bug:在讀取 POINT 數(shù)據(jù)類型時會 crash 掉,所以不得不在下面代碼中加入 do 代碼塊,然后不使用 select 語句。

  我們在 Vapor MySQL 中記錄了這個 issue,等這個 issue 修復(fù)以后,我們將更新文章。

  在下面的例子中,我們將使用 MySQL 5.7 中引入對 JSON 數(shù)據(jù)內(nèi)部的查詢特性,使用 SELECT … WHERE 查詢 JSON 數(shù)據(jù)。在這里查詢的是 samples 表中 JSON 數(shù)據(jù)類型 sample

  中、speed 字段大于 80 的數(shù)據(jù)。

  // ... 查詢

  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 函數(shù)是用來 返回從 JSON 文檔中的數(shù)據(jù),根據(jù)傳入的路徑參數(shù)選擇文檔中滿足條件的數(shù)據(jù)。在本例中,我們解包了列 sample 中的 speed 值。

  為了循環(huán)處理結(jié)果,我們使用了 for result in results 語句,接著使用 if let 語句驗證結(jié)果數(shù)據(jù)。首先使用 let sample = result["sample"]?.object 獲取一個字典,對應(yīng) MySQL 中的 JSON 文檔,這是一句關(guān)鍵的代碼!Vapor MySQL 庫并沒有返回一個 String,而 String 還需進行 JSON 的解析。這個解析工作庫已經(jīng)幫你做了,所以你可以直接使用 sample 字典啦。

  剩下的 let 語句給了我們 speed,temperature  created_at。注意 created_at  MySQL 中是DATETIME 類型,我們讀取它為字符串。為了在 Swift 中轉(zhuǎn)換成 Date 類型,需要使用 .date(from:String)方法加一個 DateFormatter 來做類型轉(zhuǎn)換。

  獲取代碼

  如果你想直接運行代碼,請到 github 上下載我們的代碼。

在任何地方使用 swift build 進行編譯,運行可執(zhí)行代碼,不要忘了你還需要擁有一個數(shù)據(jù)庫,用戶名并且授權(quán)通過。

 

文章來源:SwiftGG

您還未登錄,請先登錄

熱門帖子

最新帖子

?