gorose
gorose copied to clipboard
GoRose(go orm), a mini database ORM for golang, which inspired by the famous php framwork laravle's eloquent. It will be friendly for php developer and python or ruby developer. Currently provides six...
GoRose ORM
_______ ______ .______ ______ _______. _______
/ _____| / __ \ | _ \ / __ \ / || ____|
| | __ | | | | | |_) | | | | | | (----`| |__
| | |_ | | | | | | / | | | | \ \ | __|
| |__| | | `--' | | |\ \----.| `--' | .----) | | |____
\______| \______/ | _| `._____| \______/ |_______/ |_______|
ç¿»è¯(translation)
English readme | ä¸æ readme
ææ¡£
ææ°ç2.xææ¡£ | 1.xææ¡£ | 0.xææ¡£
ç®ä»
goroseæ¯ä¸ä¸ªgolang ormæ¡æ¶, åé´èªlaravelçeloquent.
gorose 2.0 éç¨æ¨¡ååæ¶æ, éè¿interfaceçapiéä¿¡,ä¸¥æ ¼çä¸å±ä¾èµä¸å±.æ¯ä¸ä¸ªæ¨¡åé½å¯ä»¥æå¸, çè³å¯ä»¥èªå®ä¹ä¸ºèªå·±å欢çæ ·å.
模åå
³ç³»å¾å¦ä¸:
å®è£
- go.mod
require github.com/gohouse/gorose/v2 v2.1.10
éè¦çäºæ 说ä¸é!
éè¦çäºæ 说ä¸é!
éè¦çäºæ 说ä¸é!
使ç¨çæ¶åå¿ é¡»import "github.com/gohouse/gorose/v2"
æ¹å¯æ£å¸¸ä½¿ç¨.
åä¸ä¸è¦æ¼ææ«å°¾çv2
,è¿ä¸ªæ¯vgoçè§å®
å¦æ使ç¨ææ°æ´æ°,没ætagçè¯,å¯ä»¥ä½¿ç¨
require github.com/gohouse/gorose/v2 master
,æ§è¡go mod tidy
å,ä¼èªå¨è·åææ°æ交ççæ¬hashæ为çæ¬å·,æç»ææå¦:github.com/gohouse/gorose/v2 v2.1.6-0.20200403045240-167d9094d7bd
- docker
docker run -it --rm ababy/gorose sh -c "go run main.go"
docker éå: ababy/gorose, dockeréåå å«äºgoroseæå¿ é¡»çå åè¿è¡ç¯å¢, æ¥ç
Dockerfile
- go get
go get -u github.com/gohouse/gorose/v2
æ¯æ驱å¨
- mysql : https://github.com/go-sql-driver/mysql
- sqlite3 : https://github.com/mattn/go-sqlite3
- postgres : https://github.com/lib/pq
- oracle : https://github.com/mattn/go-oci8
- mssql : https://github.com/denisenkom/go-mssqldb
- clickhouse : https://github.com/kshvakov/clickhouse
apié¢è§
db.Table().Fields().Where().GroupBy().Having().OrderBy().Limit().Select()
db.Table().Data().Insert()
db.Table().Data().Where().Update()
db.Table().Where().Delete()
ç®åç¨æ³ç¤ºä¾
package main
import (
"fmt"
"github.com/gohouse/gorose/v2"
_ "github.com/mattn/go-sqlite3"
)
var err error
var engin *gorose.Engin
func init() {
// å
¨å±åå§åæ°æ®åº,并å¤ç¨
// è¿éçenginéè¦å
¨å±ä¿å,å¯ä»¥ç¨å
¨å±åé,ä¹å¯ä»¥ç¨åä¾
// é
ç½®&gorose.Config{}æ¯åä¸æ°æ®åºé
ç½®
// å¦æé
置读åå离é群,å使ç¨&gorose.ConfigCluster{}
engin, err = gorose.Open(&gorose.Config{Driver: "sqlite3", Dsn: "./db.sqlite"})
// mysql示ä¾, è®°å¾å¯¼å
¥mysqlé©±å¨ github.com/go-sql-driver/mysql
// engin, err = gorose.Open(&gorose.Config{Driver: "mysql", Dsn: "root:root@tcp(localhost:3306)/test?charset=utf8mb4&parseTime=true"})
}
func DB() gorose.IOrm {
return engin.NewOrm()
}
func main() {
// åçsql, ç´æ¥è¿åç»æé
res,err := DB().Query("select * from users where uid>? limit 2", 1)
fmt.Println(res)
affected_rows,err := DB().Execute("delete from users where uid=?", 1)
fmt.Println(affected_rows, err)
// ormé¾å¼æä½,æ¥è¯¢åæ¡æ°æ®
res, err = DB().Table("users").First()
// res ç±»å为 map[string]interface{}
fmt.Println(res)
// ormé¾å¼æä½,æ¥è¯¢å¤æ¡æ°æ®
res2, _ := DB().Table("users").Get()
// res2 ç±»å为 []map[string]interface{}
fmt.Println(res2)
}
使ç¨å»ºè®®
goroseæä¾æ°æ®å¯¹è±¡ç»å®(map, struct), åæ¶æ¯æå符串表ååmapæ°æ®è¿å. æä¾äºå¾å¤§ççµæ´»æ§
建议ä¼å
éç¨æ°æ®ç»å®çæ¹å¼æ¥å®ææ¥è¯¢æä½, åå°æ°æ®æºç±»åå¯æ§
goroseæä¾äºé»è®¤ç gorose.Map
å gorose.Data
ç±»å, ç¨æ¥æ¹ä¾¿åå§åç»å®ådata
é ç½®åé¾æ¥åå§å
ç®åé ç½®
var configSimple = &gorose.Config{
Driver: "sqlite3",
Dsn: "./db.sqlite",
}
æ´å¤é ç½®, å¯ä»¥é ç½®é群,çè³å¯ä»¥åæ¶é ç½®ä¸åæ°æ®åºå¨ä¸ä¸ªé群ä¸, æ°æ®åºä¼éæºéæ©é群çæ°æ®åºæ¥å®æ对åºç读åæä½, å ¶ä¸masteræ¯ååº, slaveæ¯è¯»åº, éè¦èªå·±å好主ä»å¤å¶, è¿éåªè´è´£è¯»å
var config1 = gorose.Config{Dsn: "./db.sqlite"}
var config2 = gorose.Config{Dsn: "./db2.sqlite"}
var config3 = gorose.Config{Dsn: "./db3.sqlite"}
var config4 = gorose.Config{Dsn: "./db4.sqlite"}
var configCluster = &gorose.ConfigCluster{
Master: []gorose.Config{config3, config4},
Slave: []gorose.Config{config1, config2},
Driver: "sqlite3",
}
åå§å使ç¨
var engin *gorose.Engin
engin, err := Open(config)
//engin, err := Open(configCluster)
if err != nil {
panic(err.Error())
}
åçsqlæä½(å¢å æ¹æ¥), sessionç使ç¨
å建ç¨æ·è¡¨ users
DROP TABLE IF EXISTS "users";
CREATE TABLE "users" (
"uid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT NOT NULL,
"age" integer NOT NULL
);
INSERT INTO "users" VALUES (1, 'gorose', 18);
INSERT INTO "users" VALUES (2, 'goroom', 18);
INSERT INTO "users" VALUES (3, 'fizzday', 18);
å®ä¹è¡¨struct
type Users struct {
Uid int `gorose:"uid"`
Name string `gorose:"name"`
Age int `gorose:"age"`
}
// 设置表å, å¦æ没æ设置, é»è®¤ä½¿ç¨structçåå
func (u *Users) TableName() string {
return "users"
}
åçæ¥è¯¢æä½
é¤äºä¸è¾¹çç´æ¥è¿åç»æéå¤, è¿æ¯æç»å®ç»æå°ç»å®å¯¹è±¡ä¸
// è¿éæ¯è¦ç»å®çç»æä½å¯¹è±¡
// å¦æä½ æ²¡æå®ä¹ç»æä½, åå¯ä»¥ç´æ¥ä½¿ç¨map, map示ä¾
// var u = gorose.Data{}
// var u = gorose.Map{} è¿ä¸¤ä¸ªé½æ¯å¯ä»¥ç
var u Users
session := engin.NewSession()
// è¿éBind()æ¯ä¸ºäºåæ¾ç»æç, å¦æä½ ä½¿ç¨çæ¯NewOrm()åå§å,åå¯ä»¥ç´æ¥ä½¿ç¨ NewOrm().Table().Query()
_,err := session.Bind(&u).Query("select * from users where uid=? limit 2", 1)
fmt.Println(err)
fmt.Println(u)
fmt.Println(session.LastSql())
structå段顺åºéè¦è·
select *
å ç表ç»æå段顺åºä¸è´(ä¹å¯ä»¥æå¨æå®è¦æ¥è¯¢çå段), å ·ä½åå åè https://github.com/gohouse/gorose/issues/136
åçå¢å æ¹æä½
session.Execute("insert into users(name,age) values(?,?)(?,?)", "gorose",18,"fizzday",19)
session.Execute("update users set name=? where uid=?","gorose",1)
session.Execute("delete from users where uid=?", 1)
å¯¹è±¡å ³ç³»æ å°, ormç使ç¨
-
- åºæ¬é¾å¼ä½¿ç¨
var u Users
db := engin.NewOrm()
err := db.Table(&u).Fields("name").AddFields("uid","age").Distinct().Where("uid",">",0).OrWhere("age",18).
Group("age").Having("age>1").OrderBy("uid desc").Limit(10).Offset(1).Select()
ä¹å¯ä»¥ä½¿ç¨xxx.Limit().Page()
,è¿ä¸ªæ¯åºå®ç¨æ³,Page()
å¿
é¡»å¨Limit()
åè¾¹
-
- å¦æä¸æ³å®ä¹struct, åæ³ç»å®æå®ç±»åçmapç»æ, åå¯ä»¥å®ä¹mapç±»å, å¦
type user gorose.Map
// æè
以ä¸çtypeå®ä¹, é½æ¯å¯ä»¥æ£å¸¸è§£æç
type user2 map[string]interface{}
type users3 []user
type users4 []map[string]string
type users5 []gorose.Map
type users6 []gorose.Data
- 2.1 å¼å§ä½¿ç¨mapç»å®
db.Table(&user).Select()
db.Table(&users4).Limit(5).Select()
注æ: å¦æ使ç¨çä¸æ¯sliceæ°æ®ç»æ, ååªè½è·åå°ä¸æ¡æ°æ®
è¿é使ç¨ç gorose.Data , å®é
ä¸å°±æ¯ map[string]interface{}
ç±»å.
è gorose.Map
, å®é
ä¸æ¯ t.MapStringT
ç±»å, è¿éåºç°äºä¸ä¸ª t
å
, æ¯ä¸ä¸ªgolangåºæ¬æ°æ®ç±»åçç¸äºè½¬æ¢å
, 请ç详ç»ä»ç» http://github.com/gohouse/t
-
- laravelç
First()
,Get()
, ç¨æ¥è¿åç»æé
ä¹å°±æ¯è¯´, ä½ çè³å¯ä»¥ä¸ç¨ä¼ å ¥åç§ç»å®çstructåmap, ç´æ¥ä¼ å ¥è¡¨å, è¿å两个åæ°, ä¸ä¸ªæ¯[]gorose.Map
ç»æé, 第äºä¸ªæ¯error
,å ªç§°ç®åç²æ´
ç¨æ³å°±æ¯æä¸è¾¹çSelect()
æ¹æ³æ¢æ Get,First å³å¯, åªä¸è¿,Select()
åªè¿åä¸ä¸ªåæ°
- laravelç
-
- ormçå¢å æ¹æ¥
db.Table(&user2).Limit(10.Select()
db.Table(&user2).Where("uid", 1).Data(gorose.Data{"name","gorose"}).Update()
db.Table(&user2).Data(gorose.Data{"name","gorose33"}).Insert()
db.Table(&user2).Data([]gorose.Data{{"name","gorose33"},"name","gorose44"}).Insert()
db.Table(&user2).Where("uid", 1).Delete()
æç»sqlæé å¨, builderæé ä¸åæ°æ®åºçsql
ç®åæ¯æ mysql, sqlite3, postgres, oracle, mssql, clickhouseç符å database/sql
æ¥å£æ¯æçæ°æ®åºé©±å¨
è¿ä¸é¨å, ç¨æ·åºæ¬æ æç¥, åçåºæ¥, 主è¦æ¯ä¸ºäºå¼åè
å¯ä»¥èªç±æ·»å åä¿®æ¹ç¸å
³é©±å¨ä»¥è¾¾å°ä¸ªæ§åçéæ±
binder, æ°æ®ç»å®å¯¹è±¡
è¿ä¸é¨åä¹æ¯ç¨æ·æ æç¥ç, 主è¦æ¯ä¼ å ¥çç»å®å¯¹è±¡è§£æåæ°æ®ç»å®, åæ ·æ¯ä¸ºäºå¼åè 个æ§åå®å¶èç¬ç«åºæ¥ç
模åå
gorose2.0 å®å ¨æ¨¡åå, æ¯ä¸ä¸ªæ¨¡åé½å°è£ äºinterfaceæ¥å£api, 模åé´è°ç¨, é½æ¯éè¿æ¥å£, ä¸å±ä¾èµä¸å±
- 主模å
- engin
gorose åå§åé 置模å, å¯ä»¥å ¨å±ä¿å并å¤ç¨ - session
çæ£æä½æ°æ®åºåºå±æ¨¡å, ææçæä½, æç»é½ä¼èµ°å°è¿éæ¥è·åæä¿®æ¹æ°æ® - orm
å¯¹è±¡å ³ç³»æ å°æ¨¡å, ææçormæä½, é½å¨è¿éå®æ - builder
æ建ç»ææ§è¡çsql模å, å¯ä»¥æ建任ä½æ°æ®åºçsql, ä½è¦ç¬¦ådatabase/sql
å çæ¥å£
- engin
- å模å
- driver
æ°æ®åºé©±å¨æ¨¡å, 被enginåbuilderä¾èµ, æ ¹æ®é©±å¨æ¥æäºæ - binder
ç»æéç»å®æ¨¡å, ææçè¿åç»æéé½å¨è¿é
- driver
以ä¸ä¸»æ¨¡å, é½ç¸å¯¹ç¬ç«, å¯ä»¥ä¸ªæ§åå®å¶åæ¿æ¢, åªè¦å®ç°ç¸åºæ¨¡åçæ¥å£å³å¯.
æä½³å®è·µ
sql
DROP TABLE IF EXISTS "users";
CREATE TABLE "users" (
"uid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT NOT NULL,
"age" integer NOT NULL
);
INSERT INTO "users" VALUES (1, 'gorose', 18);
INSERT INTO "users" VALUES (2, 'goroom', 18);
INSERT INTO "users" VALUES (3, 'fizzday', 18);
å®æ代ç
package main
import (
"fmt"
"github.com/gohouse/gorose/v2"
_ "github.com/mattn/go-sqlite3"
)
type Users struct {
Uid int64 `gorose:"uid"`
Name string `gorose:"name"`
Age int64 `gorose:"age"`
Xxx interface{} `gorose:"-"` // è¿ä¸ªå段å¨ormä¸ä¼å¿½ç¥
}
func (u *Users) TableName() string {
return "users"
}
var err error
var engin *gorose.Engin
func init() {
// å
¨å±åå§åæ°æ®åº,并å¤ç¨
// è¿éçenginéè¦å
¨å±ä¿å,å¯ä»¥ç¨å
¨å±åé,ä¹å¯ä»¥ç¨åä¾
// é
ç½®&gorose.Config{}æ¯åä¸æ°æ®åºé
ç½®
// å¦æé
置读åå离é群,å使ç¨&gorose.ConfigCluster{}
engin, err = gorose.Open(&gorose.Config{Driver: "sqlite3", Dsn: "./db.sqlite"})
}
func DB() gorose.IOrm {
return engin.NewOrm()
}
func main() {
// è¿éå®ä¹ä¸ä¸ªåédb, æ¯ä¸ºäºå¤ç¨db对象, å¯ä»¥å¨æåä½¿ç¨ db.LastSql() è·åæåæ§è¡çsql
// å¦æä¸å¤ç¨ db, èæ¯ç´æ¥ä½¿ç¨ DB(), åä¼æ°å»ºä¸ä¸ªorm对象, æ¯ä¸æ¬¡é½æ¯å
¨æ°ç对象
// æ以å¤ç¨ db, ä¸å®è¦å¨å½åä¼è¯å¨æå
db := DB()
// æ¥è¯¢ä¸æ¡
var u Users
// æ¥è¯¢æ°æ®å¹¶ç»å®å° user{} ä¸
err = db.Table(&u).Fields("uid,name,age").Where("age",">",0).OrderBy("uid desc").Select()
if err!=nil {
fmt.Println(err)
}
fmt.Println(u, u.Name)
fmt.Println(db.LastSql())
// æ¥è¯¢å¤æ¡
// æ¥è¯¢æ°æ®å¹¶ç»å®å° []Users ä¸, è¿éå¤ç¨äº db åä¸ä¸ææ¡ä»¶åæ°
// å¦æä¸æ³å¤ç¨,åå¯ä»¥ä½¿ç¨DB()å°±ä¼å¼å¯å
¨æ°ä¼è¯,æè
使ç¨db.Reset()
// db.Reset()åªä¼æ¸
é¤ä¸ä¸æåæ°å¹²æ°,ä¸ä¼æ´æ¢é¾æ¥,DB()åä¼æ´æ¢é¾æ¥
var u2 []Users
err = db.Table(&u2).Limit(10).Offset(1).Select()
fmt.Println(u2)
// ç»è®¡æ°æ®
var count int64
// è¿éresetæ¸
é¤ä¸è¾¹æ¥è¯¢çåæ°å¹²æ°, å¯ä»¥ç»è®¡æææ°æ®, å¦æä¸æ¸
é¤, åæ¡ä»¶ä¸ºä¸è¾¹æ¥è¯¢çæ¡ä»¶
// åæ¶, å¯ä»¥æ°è°ç¨ DB(), ä¹ä¸ä¼äº§çå¹²æ°
count,err = db.Reset().Count()
// æ
count, err = DB().Table(&u).Count()
fmt.Println(count, err)
}
é«çº§ç¨æ³
-
Chunk æ°æ®åç 大éæ°æ®æ¹éå¤ç (累积å¤ç)
å½éè¦æä½å¤§éæ°æ®çæ¶å, ä¸æ¬¡æ§ååºåæä½, ä¸å¤ªåç, å°±å¯ä»¥ä½¿ç¨chunkæ¹æ³ chunkç第ä¸ä¸ªåæ°æ¯æå®ä¸æ¬¡æä½çæ°æ®é, æ ¹æ®ä¸å¡é, å100æ¡æè 1000æ¡é½å¯ä»¥ chunkç第äºä¸ªåæ°æ¯ä¸ä¸ªåè°æ¹æ³, ç¨äºä¹¦åæ£å¸¸çæ°æ®å¤çé»è¾ ç®çæ¯åå°, æ æç¥å¤ç大éæ°æ® å®ç°åçæ¯, æ¯ä¸æ¬¡æä½, èªå¨è®°å½å½åçæä½ä½ç½®, ä¸ä¸æ¬¡éå¤åæ°æ®çæ¶å, ä»å½åä½ç½®å¼å§å
ser := db.Table("users") ser.Fields("id, name").Where("id",">",2).Chunk(2, func(data []gorose.Data) error { // for _,item := range data { // fmt.Println(item) // } fmt.Println(data) // è¿éä¸è¦å¿è®°è¿åé误ænil return nil ) / æå°ç»æ: / 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]]
-
Loop æ°æ®åç 大éæ°æ®æ¹éå¤ç (ä»å¤´å¤ç)
类似 chunk æ¹æ³, å®ç°åçæ¯, æ¯ä¸æ¬¡æä½, é½æ¯ä»å¤´å¼å§åæ°æ® åå : å½æ们æ´æ¹æ°æ®æ¶, æ´æ¹çç»æå¯è½ä½ä¸ºwhereæ¡ä»¶ä¼å½±åæ们åæ°æ®çç»æ,æ以, å¯ä»¥ä½¿ç¨Loop
ser := db.Table("users") ser.Fields("id, name").Where("id",">",2).Loop(2, func(data []gorose.Data) error { // for _,item := range data { // fmt.Println(item) // } // è¿éæ§è¡update / delete çæä½ // è¿éä¸è¦å¿è®°è¿åé误ænil return nil )
-
åµå¥where
/ SELECT * FROM users / WHERE id > 1 / and ( name = 'fizz' / or ( name = 'fizz2' / and ( name = 'fizz3' or website like 'fizzday%') / ) / ) / and job = 'it' LIMIT 1 ser := db.Table("users") ser.Where("id", ">", 1).Where(func() { User.Where("name", "fizz").OrWhere(func() { User.Where("name", "fizz2").Where(func() { User.Where("name", "fizz3").OrWhere("website", "like", "fizzday%") }) }) }).Where("job", "it").First()
-
åµå ¥åçsql示ä¾
以ä¸å ç§æä½æ¯çæç
db.Table("users").WhereRegexp("name","\w+").BuildSql()
db.Table("users").Where("name","regexp","\w+").BuildSql()
db.Table("users").Where([]interface{}{"name","regexp","\w+"}).BuildSql()
db.Table("users").Where(gorose.Data{"name regexp","\w+"}).BuildSql()
å级æ¥å¿
-
v2.1.5-master:
- å¢å
regexp
表达å¼å¨where
ä¸ç使ç¨
- å¢å
-
v2.1.4:
- loggerä¿®æ£
- äºç©æ¹è¿
- ä¾èµå æ¹ä¸º gohouse/golib(gohouse/t,gohouse/gocar)
-
v2.1.x:
- join表èªå¨å åç¼,ä¸éè¦åæå¨å åç¼
- åçsqlç
query()
æ¹æ³,å¢å è¿åç»æé[]map[string]interface{}
-
v2.0.0: è¹æ°çæ¬,è¹æ°æ¶æ
å级æå
ä»2.0.xå级å°2.1.x
-
xxx.Join("pre_tablename")
æ´æ¹ä¸ºxxx.Join("tablename")
,è¿éä¸éè¦æå¨æå®è¡¨åç¼ -
err:=DB().Bind().Query()
,æ´æ¹ä¸ºå¤è¿åres,err:=DB().Query()
,åæ¶ä¿çäºBind()
ç¨æ³
ä»1.xå级å°2.x, å ¨æ°å®è£
Jetbrains å¼æºæ¯æ
gorose
项ç®ä¸ç´ä»¥æ¥é½æ¯å¨ JetBrains å
¬å¸æä¸ç GoLand éæå¼åç¯å¢ä¸è¿è¡å¼åï¼åºäº free JetBrains Open Source license(s) æ£çå
è´¹ææï¼å¨æ¤è¡¨è¾¾æçè°¢æã
èµå©æ¸ é
微信 | æ¯ä»å® | paypal: click |
---|---|---|
![]() |
![]() |
![]() |
- æèµ å表
total | avator |
---|---|
ï¿¥100 |