您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
三六零分类信息网 > 贺州分类信息网,免费分类信息发布

使用 Swift 3.0 操作 MySQL 数据库

2025/11/3 7:15:56发布17次查看
开始
在这篇教程中,我们采用 ubuntu 16.04 系统和 mysql 5.7。mysql 5.7 引入了一系列的新特性。其中一个就是提供了更加高效的存储 json 数据的能力,同时提供了查询 json 数据内部的能力。稍后如果 mysql 5.7 成为了 ubuntu 16.04 上默认的 mysql 版本以后,我们将使用 ubuntu 16.04 作为我们的操作系统。
如果你还没有安装 swift, 你可以使用 apt-get 方式来安装。参见这篇文章的说明安装。2016 年 9 月底,苹果也开始在 ubuntu16.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) ] )
第二步,我们使用一些辅助的工具代码来生成一些随机的数据,填充到数据库中。在 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) 方法。需要注意的是该方法和一些抽象 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) }
查询结果也是使用的 execute(_:string) 方法。但是返回的结果是一个 [string:node] 字典。字典的 key 对应着数据库的列名。
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 进行编译,运行可执行代码,不要忘了你还需要拥有一个数据库,用户名并且授权通过。
贺州分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product