這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。 gorose(go orm), 一個小巧強悍的go語言資料庫操作orm, 靈感來源於laravel的資料庫操作orm, 也就是eloquent, 做php的, python的, ruby的, 都會喜歡上這個orm的操作方式, 主要是鏈式操作比較風騷- [English Document](https://github.com/gohouse/gorose)- [中文文檔](https://github.com/gohouse/gorose/blob/master/README-ZH_CN.md)## 安裝- 安裝 gorose```gogo get github.com/gohouse/gorose```- 安裝gorose中使用到的函數工具包```gogo get github.com/gohouse/utils```## 配置和樣本- 多個資料庫連接配置 ```goimport "github.com/gohouse/gorose"var dbConfig = map[string]map[string]string { "mysql": { "host": "localhost", "username": "root", "password": "", "port": "3306", "database": "test", "charset": "utf8", "protocol": "tcp", }, "mysql_dev": { "host": "localhost", "username": "root", "password": "", "port": "3306", "database": "gorose", "charset": "utf8", "protocol": "tcp", },}gorose.Open(dbConfig, "mysql")var db gorose.Databasefunc main() { res := db.Table("users").First() fmt.Println(res)}```- 簡單的但資料庫配置 ```gogorose.Open(map[string]string { "host": "localhost", "username": "root", "password": "", "port": "3306", "database": "test", "charset": "utf8", "protocol": "tcp", })```## 用法樣本### 查詢#### 原生sql語句查詢```godb.Query("select * from user where id = 1")```#### 鏈式調用查詢 ```godb.Table("user"). Field("id, name"). // field Where("id",">",1). // simple where Where(map[string]interface{}{"name":"fizzday", "age":18}). // where object Where([]map[string]interface{}{{"website", "like", "fizz"}, {"job", "it"}}). // multi where Where("head = 3 or rate is not null"). // where string OrWhere("cash", "1000000"). // or where ... OrWhere("score", "between", []string{50, 80}). // between OrWhere("role", "not in", []string{"admin", "read"}). // in Group("job"). // group Order("age asc"). // order Limit(10). // limit Offset(1). // offset Get() // fetch multi rows```得到sql結果: ```goselect id,name from user where (id>1) and (name='fizzday' and age='18') and ((website like '%fizz%') and (job='it')) and (head =3 or rate is not null) or (cash = '100000') or (score between '50' and '100') or (role not in ('admin', 'read')) group by job order by age asc limit 10 offset 1``` #### 更多鏈式查詢樣本- 擷取user表對象```goUser := db.Table("user")```- 查詢一條```goUser.First()// 或者db.Fisrt()```parse sql result: `select * from user limit 1` - count統計```goUser.Count("*")// 或(下同) db.Count("*")```最終執行的sql為: `select count(*) as count from user` - max```goUser.Max("age")```最終執行的sql為: `select max(age) as max from user` - min```goUser.Min("age")```最終執行的sql為: `select min(age) as min from user` - avg```goUser.Avg("age")```最終執行的sql為: `select avg(age) as avg from user` - distinct```goUser.Fields("id, name").Distinct()```最終執行的sql為: `select distinct id,name from user` #### 嵌套where的查詢 (where nested)```godb.Table("user").Where("id", ">", 1).Where(func() {db.Where("name", "fizz").OrWhere(func() {db.Where("name", "fizz2").Where(func() {db.Where("name", "fizz3").OrWhere("website", "fizzday")})})}).Where("job", "it").First()```最終執行的sql為: ```goSELECT * FROM user WHERE id > '1' and ( name = 'fizz' or ( name = 'fizz2' and ( name = 'fizz3' or website like '%fizzday%') ) ) and job = 'it' LIMIT 1``` #### 事務- 標準用法 ```godb.Begin()res := db.Table("user").Where("id", 1).Data(map[string]interface{}{"age":18}).Update()if (res == 0) {db.Rollback()}res2 := db.Table("user").Data(map[string]interface{}{"age":18}).Insert()if (res2 == 0) {db.Rollback()}db.Commit()```- 簡單用法, 用閉包實現, 自動開始事務, 復原或提交事務 ```godb.Transaction(func() { db.Execute("update area set job='sadf' where id=14") db.Table("area").Data(map[string]interface{}{"names": "fizz3", "age": 3}).Insert() db.Table("area").Data(map[string]interface{}{"names": "fizz3", "age": 3}).Where("id",10).Update()})```### 增刪改操作#### 原生sql字串```godb.Execute("update user set job='it2' where id=3")```#### 鏈式調用 ```godb.Table("user").Data(map[string]interface{}{"age":17, "job":"it3"}). Where("id", 1). OrWhere("age",">",30). Update()```最終執行的sql為: `update user set age=17, job='ite3' where (id=1) or (age>30)` #### 更多增刪改的用法- insert ```goUser.Data(map[string]interface{}{"age":17, "job":"it3"}).Insert()User.Data([]map[string]interface{}{{"age":17, "job":"it3"},{"age":17, "job":"it4"}).Insert()```最終執行的sql為: ```goinsert into user (age, job) values (17, 'it3')insert into user (age, job) values (17, 'it3') (17, 'it4')```- delete ```goUser.Where("id", 5).Delete()```最終執行的sql為: `delete from user where id=5`## 切換資料庫連接 ```go// 串連最開始配置的第二個連結(mysql_dev是key)db.Connect("mysql_dev").Table().First()// 或者直接輸入串連配置db.Connect(map[string]string { "host": "localhost", "username": "root", "password": "", "port": "3306", "database": "test", "charset": "utf8", "protocol": "tcp", }).Table().First()``` ------------#### [點擊查看最新更新動態](https://github.com/gohouse/gorose)587 次點擊 ∙ 1 贊