@@ -9,9 +9,9 @@ https://github.com/jmoiron/sqlx
99# Example:
1010More example see the [ example] ( ./example ) directory.
1111
12- ## Using a manual cache
12+ ## Directing use
1313``` text
14- package db
14+ package main
1515
1616import (
1717 "github.com/gwaylib/conf"
@@ -20,18 +20,20 @@ import (
2020 _ "github.com/go-sql-driver/mysql"
2121)
2222
23- func init () {
24- db , err := qsql.Open(qsql.DRV_NAME_MYSQL, dsn)
23+ func main () {
24+ mdb , err := qsql.Open(qsql.DRV_NAME_MYSQL, dsn)
2525 if err != nil{
2626 panic(err)
2727 }
28- qsql.RegCache("main", db)
28+ arr := make([]string, 3)
29+ if err := mdb.QueryElems(&arr, "SELECT id, created_at, updated_at WHERE id=?", 1); err != nil{
30+ panic(err)
31+ }
2932}
3033```
3134
32-
33- ## Using etc cache
34- Assume that the configuration file path is: './etc/db.cfg'
35+ ## Using ini cache
36+ the configuration file path like : './etc/db.cfg'
3537
3638The etc file content
3739```
@@ -49,7 +51,7 @@ dsn: username:passwd@tcp(127.0.0.1:3306)/log?timeout=30s&strict=true&loc=Local&p
4951max_life_time:7200
5052```
5153
52- Make a package for connection cache with ini
54+ Make a package for cache.go with ini
5355``` text
5456package db
5557
@@ -61,6 +63,13 @@ import (
6163
6264func init() {
6365 qsql.RegCacheWithIni(conf.RootDir() + "/etc/db.cfg")
66+
67+ // Register cache without ini
68+ // db, err := qsql.Open(qsql.DRV_NAME_MYSQL, dsn)
69+ // if err != nil{
70+ // panic(err)
71+ // }
72+ // qsql.RegCache("main", db)
6473}
6574
6675func GetCache(section string) *qsql.DB {
@@ -76,16 +85,33 @@ func CloseCache() {
7685}
7786```
7887
79- Call a cache
88+ Using the cache package
8089``` text
81- mdb := qsql.GetCache("main")
90+ package main
91+
92+ import (
93+ "github.com/gwaylib/conf"
94+ "github.com/gwaylib/errors"
95+ _ "github.com/go-sql-driver/mysql"
96+
97+ "model/db"
98+ )
99+
100+ func main() {
101+ mdb := db.GetCache("main")
102+ arr := make([]string, 3)
103+ if err := mdb.QueryElems(&arr, "SELECT id, created_at, updated_at WHERE id=?", 1); err != nil{
104+ panic(err)
105+ }
106+ }
82107```
83108
84- ## Call standard sql
109+ ## Standard sql
110+ * qsql.DB has implements * sql.DB, so you can call qsql.DB like * sql.DB
85111``` text
86- mdb := qsql .GetCache("main")
112+ mdb := db .GetCache("main")
87113
88- row := mdb.QueryRow("SELECT * ...")
114+ row := mdb.QueryRow("SELECT * ...") //
89115// ...
90116
91117rows, err := mdb.Query("SELECT * ...")
@@ -95,7 +121,8 @@ result, err := mdb.Exec("UPDATE ...")
95121// ...
96122```
97123
98- ## Insert a struct to db(using reflect)
124+ ## Insert struct(s) into table
125+ the struct tag format like ` db:"field" ` , reference to: http://github.com/jmoiron/sqlx
99126``` text
100127type User struct{
101128 Id int64 `db:"id,auto_increment"` // flag "autoincrement", "auto_increment" are supported .
@@ -104,7 +131,7 @@ type User struct{
104131}
105132
106133func main() {
107- mdb := qsql .GetCache("main")
134+ mdb := db .GetCache("main")
108135
109136 var u = &User{
110137 Name:"testing",
@@ -119,8 +146,13 @@ func main() {
119146
120147```
121148
122- ## Quick query way
149+ ## Quick sql way
123150``` text
151+ package main
152+
153+ import (
154+ gErrors "github.com/gwaylib/errors"
155+ )
124156
125157// Way 1: query result to a struct.
126158type User struct{
@@ -129,66 +161,17 @@ type User struct{
129161}
130162
131163func main() {
132- mdb := qsql .GetCache("main")
164+ mdb := db .GetCache("main")
133165 var u = *User{}
134- if err := mdb.QueryStruct(u, "SELECT id, name FROM a WHERE id = ?", id)
135- if err != nil{
136- // sql.ErrNoRows has been replace by errors.ErrNoData
137- if errors.ErrNoData.Equal(err) {
166+ if err := mdb.QueryStruct(u, "SELECT id, name FROM a WHERE id = ?", id); err != nil {
167+ // sql.ErrNoRows has been replace by gErrors.ErrNoData
168+ if gErrors.ErrNoData.Equal(err) {
138169 // no data
139170 }
140171 // ...
141172 }
142173 // ..
143-
144- // Way 2: query row to struct
145- mdb := qsql.GetCache("main")
146- var u = *User{}
147- if err := mdb.ScanStruct(mdb.QueryRow("SELECT id, name FROM a WHERE id = ?", id), u); err != nil {
148- // sql.ErrNoRows has been replace by errors.ErrNoData
149- if errors.ErrNoData.Equal(err) {
150- // no data
151- }
152- // ...
153- }
154-
155- // Way 3: query result to structs
156- mdb := qsql.GetCache("main")
157- var u = []*User{}
158- if err := mdb.QueryStructs(&u, "SELECT id, name FROM a WHERE id = ?", id); err != nil {
159- // ...
160- }
161- if len(u) == 0{
162- // data not found
163- // ...
164- }
165- // ..
166-
167- // Way 4: query rows to structs
168- mdb := qsql.GetCache("main")
169- rows, err := mdb.Query("SELECT id, name FROM a WHERE id = ?", id)
170- if err != nil {
171- // ...
172- }
173- defer qsql.Close(rows)
174- var u = []*User{}
175- if err := mdb.ScanStructs(rows, &u); err != nil{
176- // ...
177- }
178- if len(u) == 0{
179- // data not found
180- // ...
181- }
182174
183- }
184-
185- ```
186-
187- ## Query an element which is implemented sql.Scanner
188-
189- ``` text
190- func main() {
191- mdb := qsql.GetCache("main")
192175 count := 0
193176 if err := mdb.QueryElem(&count, "SELECT count(*) FROM a WHERE id = ?", id); err != nil{
194177 // sql.ErrNoRows has been replace by errors.ErrNoData
@@ -199,39 +182,6 @@ func main() {
199182 }
200183}
201184```
202- ## Extend the where in stmt
203- ``` text
204- // Example for the first input:
205- func main() {
206- mdb := qsql.GetCache("main")
207- args:=[]int{1,2,3}
208- mdb.Query(fmt.Sprintf("select * from table_name where in (%s)", mdb.StmtWhereIn(0, len(args))), qsql.StmtSliceArgs(args)...)
209- // Or
210- mdb.Query(fmt.Sprintf("select * from table_name where in (%s)", mdb.StmtWhereIn(0, len(args), qsql.DRV_NAME_MYSQL), qsql.StmtSliceArgs(args)...)
211-
212- // Example for the second input:
213- mdb.Query(fmt.Sprintf("select * from table_name where id=? in (%s)", qsql.StmtWhereIn(1,len(args)), qsql.StmtSliceArgs(id, args)...)
214- }
215- ```
216-
217- ## Mass query.
218- ``` text
219- func main() {
220- mdb := qsql.GetCache("main")
221- qSql = &qsql.Page{
222- CountSql:`SELECT count(1) FROM user_info WHERE create_time >= ? AND create_time <= ?`,
223- DataSql:`SELECT mobile, balance FROM user_info WHERE create_time >= ? AND create_time <= ?`
224- }
225- count, titles, result, err := qSql.QueryPageArray(db, true, condition, 0, 10)
226- // ...
227- // Or
228- count, titles, result, err := qSql.QueryPageMap(db, true, condtion, 0, 10)
229- // ...
230- if err != nil {
231- // ...
232- }
233- }
234- ```
235185
236186## Make a lazy tx commit
237187``` text
@@ -248,8 +198,39 @@ func main() {
248198 }
249199 return nil
250200 }
251- if err := qsql .Commit(tx, fn); err != nil {
201+ if err := mdb .Commit(tx, fn); err != nil {
252202 // ...
253203 }
254204}
255205```
206+
207+ ## SqlBuilder
208+ ``` text
209+ func main() {
210+ mdb := qsql.GetCache("main")
211+
212+ id := 0
213+ inIds := []interface{}{1,2}
214+
215+ bd := qsql.NewSqlBuilder(mdb.DriverName())
216+ bd.Select("id", "created_at")
217+ bd.Add("FROM")
218+ bd.AddTab("tmp")
219+ bd.Add("WHERE")
220+ bd.AddTab("created_at BETWEEN ? AND ?", time.Now().AddDate(-1,0,0), time.Now())
221+ bd.AddTabIf(len(inIds)>0, "AND id IN ("+bd.AddIn(inIds)+")", id)
222+ titles, data, err := mdb.QueryPageArr(bd.String(), bd.Args()...)
223+ if err != nil {
224+ panic(err)
225+ }
226+
227+ updateBD := qsql.NewSqlBuilder(mdb.DriverName())
228+ updateBD.Add("UPDATE tmp SET")
229+ updateBD.AddTab("(updated_at=?,name=?)", time.Now())
230+ updateDB.Add("WHERE")
231+ updateDB.AddTab("id=?", id)
232+ if _, err := mdb.Exec(updateDB.String(), updateDB.Args()...); err != nil{
233+ panic(err)
234+ }
235+ }
236+ ```
0 commit comments