簡介
gorose(go orm), 一個(gè)小巧強(qiáng)悍的go語言數(shù)據(jù)庫操作orm, 靈感來源于laravel的數(shù)據(jù)庫操作orm, 也就是eloquent, php、python、ruby開發(fā)者, 都會喜歡上這個(gè)orm的操作方式, 主要是鏈?zhǔn)讲僮鞅容^風(fēng)騷
github
先睹為快
db.Table("tablename").First()
db.Table("tablename").Distinct().Where("id", ">", 5).Get()
db.Table("tablename").Fields("id, name, age, job").Group("job").Limit(10).Offset(20).Order("id desc").Get()
安裝
- 安裝 gorose
go get github.com/gohouse/gorose
配置和示例
- 多個(gè)數(shù)據(jù)庫連接配置
import "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.Database
func main() {
res := db.Table("users").First()
fmt.Println(res)
}
- 簡單的但數(shù)據(jù)庫配置
gorose.Open(map[string]string {
"host": "localhost",
"username": "root",
"password": "",
"port": "3306",
"database": "test",
"charset": "utf8",
"protocol": "tcp",
})
用法示例
查詢
原生sql語句查詢
db.Query("select * from user where id = 1")
鏈?zhǔn)秸{(diào)用查詢
db.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結(jié)果:
select 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
更多鏈?zhǔn)讲樵兪纠?/h4>
- 獲取user表對象
User := db.Table("user")
- 查詢一條
User.First()
// 或者
db.Fisrt()
User := db.Table("user")
User.First()
// 或者
db.Fisrt()
parse sql result: select * from user limit 1
- count統(tǒng)計(jì)
User.Count("*")
// 或(下同)
db.Count("*")
最終執(zhí)行的sql為: select count(*) as count from user
- max
User.Max("age")
最終執(zhí)行的sql為: select max(age) as max from user
- min
User.Min("age")
最終執(zhí)行的sql為: select min(age) as min from user
- avg
User.Avg("age")
最終執(zhí)行的sql為: select avg(age) as avg from user
- distinct
User.Fields("id, name").Distinct()
最終執(zhí)行的sql為: select distinct id,name from user
join
db.Table("user")
.Join("card","user.id","=","card.user_id")
.Limit(10)
.Get()
最終執(zhí)行的sql為:
select * from user inner join card on user.id=card.user_id limit 10
db.Table("user")
.LeftJoin("card","user.id","=","card.user_id")
.First()
最終執(zhí)行的sql為:
select * from user left join card on user.id=card.user_id limit 1
RightJoin : right join
嵌套where的查詢 (where nested)
db.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()
最終執(zhí)行的sql為:
SELECT * FROM user
WHERE id > '1'
and ( name = 'fizz'
or ( name = 'fizz2'
and ( name = 'fizz3' or website like '%fizzday%')
)
)
and job = 'it' LIMIT 1
分塊獲取數(shù)據(jù)
db.JsonEncode(false) // 如果在項(xiàng)目入口設(shè)置了返回json JsonEncode=true
db.Table("users").Fields("id, name").Where("id",">",2).Chunk(2, func(data []map[string]interface{}) {
// for _,item := range data {
// fmt.Println(item)
// }
fmt.Println(data)
})
打印結(jié)果:
// map[id:3 name:gorose]
// map[id:4 name:fizzday]
// map[id:5 name:fizz3]
// map[id:6 name:gohouse]
[map[id:3 name:gorose] map[name:fizzday id:4]]
[map[id:5 name:fizz3] map[id:6 name:gohouse]]
增刪改操作
原生sql字符串
db.Execute("update user set job='it2' where id=3")
鏈?zhǔn)秸{(diào)用
db.Table("user").
Data(map[string]interface{}{"age":17, "job":"it3"}).
Where("id", 1).
OrWhere("age",">",30).
Update()
最終執(zhí)行的sql為: update user set age=17, job='ite3' where (id=1) or (age>30)
更多增刪改的用法
- insert
User.Data(map[string]interface{}{"age":17, "job":"it3"}).Insert()
User.Data([]map[string]interface{}{{"age":17, "job":"it3"},{"age":17, "job":"it4"}).Insert()
最終執(zhí)行的sql為:
insert into user (age, job) values (17, 'it3')
insert into user (age, job) values (17, 'it3') (17, 'it4')
- delete
User.Where("id", 5).Delete()
最終執(zhí)行的sql為: delete from user where id=5
事務(wù)
- 標(biāo)準(zhǔn)用法
db.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()
- 簡單用法, 用閉包實(shí)現(xiàn), 自動開始事務(wù), 回滾或提交事務(wù)
db.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()
})
切換數(shù)據(jù)庫連接
// 連接最開始配置的第二個(gè)鏈接(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()
獲取原始連接 DB
gorose.GetDB()
獲取所有sql記錄, 或者獲取最后一條sql語句
db.SqlLogs()
db.LastSql()
TODO
[] 讀寫分離