@@ -9,23 +9,47 @@ https://github.com/jmoiron/sqlx
99# Example:
1010More example see the [ example] ( ./example ) directory.
1111
12+ ## Using a manual cache
13+ ``` text
14+ package db
15+
16+ import (
17+ "github.com/gwaylib/conf"
18+ "github.com/gwaylib/errors"
19+ "github.com/gwaylib/qsql"
20+ _ "github.com/go-sql-driver/mysql"
21+ )
22+
23+ func init() {
24+ db, err := qsql.Open(qsql.DRV_NAME_MYSQL, dsn)
25+ if err != nil{
26+ panic(err)
27+ }
28+ qsql.RegCache("main", db)
29+ }
30+ ```
31+
32+
1233## Using etc cache
1334Assume that the configuration file path is: './etc/db.cfg'
1435
1536The etc file content
1637```
17- [master ]
38+ [main ]
1839driver: mysql
1940dsn: username:passwd@tcp(127.0.0.1:3306)/main?timeout=30s&strict=true&loc=Local&parseTime=true&allowOldPasswords=1
20- life_time:7200
41+ max_life_time:7200 # seconds
42+ max_idle_time:0 # seconds
43+ max_idle_conns:0 # num
44+ max_open_conns:0 # num
2145
2246[log]
2347driver: mysql
2448dsn: username:passwd@tcp(127.0.0.1:3306)/log?timeout=30s&strict=true&loc=Local&parseTime=true&allowOldPasswords=1
25- life_time :7200
49+ max_life_time :7200
2650```
2751
28- Make a package for connection cache
52+ Make a package for connection cache with ini
2953``` text
3054package db
3155
@@ -39,31 +63,23 @@ import (
3963var dbFile = conf.RootDir() + "/etc/db.cfg"
4064
4165func init() {
42- qsql.REFLECT_DRV_NAME = qsql.DRV_NAME_MYSQL
43- }
44-
45- func GetCache(section string) *qsql.DB {
46- return qsql.GetCache(dbFile, section)
47- }
48-
49- func HasCache(section string) (*qsql.DB, error) {
50- return qsql.HasCache(dbFile, section)
51- }
52-
53- func CloseCache() {
54- qsql.CloseCache()
66+ if err := qsql.RegCacheWithIni(dbFile, "main"); err != nil{
67+ panic(err)
68+ }
69+ if err := qsql.RegCacheWithIni(dbFile, "log"); err != nil{
70+ panic(err)
71+ }
5572}
5673```
5774
5875Call a cache
5976``` text
60- mdb := db .GetCache("master ")
77+ mdb := qsql .GetCache("main ")
6178```
6279
6380## Call standar sql
6481``` text
65- mdb := db.GetCache("master")
66- // or mdb = <sql.Tx>
82+ mdb := qsql.GetCache("main")
6783
6884row := mdb.QueryRow("SELECT * ...")
6985// ...
@@ -83,21 +99,20 @@ type User struct{
8399 Ignore string `db:"-"` // ignore flag: "-"
84100}
85101
86- var u = &User{
87- Name:"testing",
88- }
102+ func main() {
103+ mdb := qsql.GetCache("main")
89104
90- // Insert data with default driver.
91- if _, err := qsql.InsertStruct(mdb, u, "testing"); err != nil{
92- // ...
93- }
94- // ...
105+ var u = &User{
106+ Name:"testing",
107+ }
95108
96- // Or Insert data with designated driver.
97- if _, err := qsql.InsertStruct(mdb, u, "testing", qsql.DRV_NAME_MYSQL); err != nil{
98- // ...
109+ // Insert data with driver.
110+ if _, err := mdb.InsertStruct(u, "testing"); err != nil{
111+ // ...
112+ }
113+ // ...
99114}
100- // ...
115+
101116```
102117
103118## Quick query way
@@ -109,120 +124,128 @@ type User struct{
109124 Name string `db:"name"`
110125}
111126
112- mdb := db.GetCache("master")
113- // or mdb = <sql.Tx>
114- var u = *User{}
115- if err := qsql.QueryStruct(mdb, u, "SELECT id, name FROM a WHERE id = ?", id)
116- if err != nil{
117- // sql.ErrNoRows has been replace by errors.ErrNoData
118- if errors.ErrNoData.Equal(err) {
119- // no data
127+ func main() {
128+ mdb := qsql.GetCache("main")
129+ var u = *User{}
130+ if err := mdb.QueryStruct(u, "SELECT id, name FROM a WHERE id = ?", id)
131+ if err != nil{
132+ // sql.ErrNoRows has been replace by errors.ErrNoData
133+ if errors.ErrNoData.Equal(err) {
134+ // no data
135+ }
136+ // ...
120137 }
121- // ...
122- }
123- // ..
124-
125- // Way 2: query row to struct
126- mdb := db.GetCache("master")
127- // or mdb = <sql.Tx>
128- var u = *User{}
129- if err := qsql.ScanStruct(qsql.QueryRow(mdb, "SELECT id, name FROM a WHERE id = ?", id), u); err != nil {
130- // sql.ErrNoRows has been replace by errors.ErrNoData
131- if errors.ErrNoData.Equal(err) {
132- // no data
138+ // ..
139+
140+ // Way 2: query row to struct
141+ mdb := qsql.GetCache("main")
142+ var u = *User{}
143+ if err := mdb.ScanStruct(mdb.QueryRow("SELECT id, name FROM a WHERE id = ?", id), u); err != nil {
144+ // sql.ErrNoRows has been replace by errors.ErrNoData
145+ if errors.ErrNoData.Equal(err) {
146+ // no data
147+ }
148+ // ...
149+ }
150+
151+ // Way 3: query result to structs
152+ mdb := qsql.GetCache("main")
153+ var u = []*User{}
154+ if err := mdb.QueryStructs(&u, "SELECT id, name FROM a WHERE id = ?", id); err != nil {
155+ // ...
156+ }
157+ if len(u) == 0{
158+ // data not found
159+ // ...
160+ }
161+ // ..
162+
163+ // Way 4: query rows to structs
164+ mdb := qsql.GetCache("main")
165+ rows, err := mdb.Query("SELECT id, name FROM a WHERE id = ?", id)
166+ if err != nil {
167+ // ...
168+ }
169+ defer qsql.Close(rows)
170+ var u = []*User{}
171+ if err := mdb.ScanStructs(rows, &u); err != nil{
172+ // ...
173+ }
174+ if len(u) == 0{
175+ // data not found
176+ // ...
133177 }
134- // ...
135- }
136-
137- // Way 3: query result to structs
138- mdb := db.GetCache("master")
139- // or mdb = <sql.Tx>
140- var u = []*User{}
141- if err := qsql.QueryStructs(mdb, &u, "SELECT id, name FROM a WHERE id = ?", id); err != nil {
142- // ...
143- }
144- if len(u) == 0{
145- // data not found
146- // ...
147- }
148- // ..
149178
150- // Way 4: query rows to structs
151- mdb := db.GetCache("master")
152- // or mdb = <sql.Tx>
153- rows, err := qsql.Query(mdb, "SELECT id, name FROM a WHERE id = ?", id)
154- if err != nil {
155- // ...
156- }
157- defer qsql.Close(rows)
158- var u = []*User{}
159- if err := qsql.ScanStructs(rows, &u); err != nil{
160- // ...
161- }
162- if len(u) == 0{
163- // data not found
164- // ...
165179}
166180
167181```
168182
169183## Query an element which is implemented sql.Scanner
170184
171185``` text
172- mdb := db.GetCache("master")
173- // or mdb = <sql.Tx>
174- count := 0
175- if err := qsql.QueryElem(mdb, &count, "SELECT count(*) FROM a WHERE id = ?", id); err != nil{
176- // sql.ErrNoRows has been replace by errors.ErrNoData
177- if errors.ErrNoData.Equal(err) {
178- // no data
186+ func main() {
187+ mdb := qsql.GetCache("main")
188+ count := 0
189+ if err := mdb.QueryElem(&count, "SELECT count(*) FROM a WHERE id = ?", id); err != nil{
190+ // sql.ErrNoRows has been replace by errors.ErrNoData
191+ if errors.ErrNoData.Equal(err) {
192+ // no data
193+ }
194+ // ...
179195 }
180- // ...
181196}
182197```
183198## Extend the where in stmt
199+ ``` text
184200// Example for the first input:
185- mdb := db.GetCache("master")
186- args:=[ ] int{1,2,3}
187- mdb.Query(fmt.Sprintf("select * from table_name where in (%s)", qsql.StmtWhereIn(0,len(args))), qsql.StmtSliceArgs(args)...)
188- // Or
189- mdb.Query(fmt.Sprintf("select * from table_name where in (%s)", qsql.StmtWhereIn(0,len(args), qsql.DRV_NAME_MYSQL), qsql.StmtSliceArgs(args)...)
190-
191- // Example for the second input:
192- mdb.Query(fmt.Sprintf("select * from table_name where id=? in (%s)", qsql.StmtWhereIn(1,len(args)), qsql.StmtSliceArgs(id, args)...)
201+ func main() {
202+ mdb := qsql.GetCache("main")
203+ args:=[]int{1,2,3}
204+ mdb.Query(fmt.Sprintf("select * from table_name where in (%s)", mdb.StmtWhereIn(0, len(args))), qsql.StmtSliceArgs(args)...)
205+ // Or
206+ mdb.Query(fmt.Sprintf("select * from table_name where in (%s)", mdb.StmtWhereIn(0, len(args), qsql.DRV_NAME_MYSQL), qsql.StmtSliceArgs(args)...)
207+
208+ // Example for the second input:
209+ mdb.Query(fmt.Sprintf("select * from table_name where id=? in (%s)", qsql.StmtWhereIn(1,len(args)), qsql.StmtSliceArgs(id, args)...)
210+ }
211+ ```
193212
194213## Mass query.
195214``` text
196- mdb := db.GetCache("master")
197- qSql = &qsql.Page{
198- CountSql:`SELECT count(1) FROM user_info WHERE create_time >= ? AND create_time <= ?`,
199- DataSql:`SELECT mobile, balance FROM user_info WHERE create_time >= ? AND create_time <= ?`
200- }
201- count, titles, result, err := qSql.QueryPageArray(db, true, condition, 0, 10)
202- // ...
203- // Or
204- count, titles, result, err := qSql.QueryPageMap(db, true, condtion, 0, 10)
205- // ...
206- if err != nil {
207- // ...
215+ func main() {
216+ mdb := qsql.GetCache("main")
217+ qSql = &qsql.Page{
218+ CountSql:`SELECT count(1) FROM user_info WHERE create_time >= ? AND create_time <= ?`,
219+ DataSql:`SELECT mobile, balance FROM user_info WHERE create_time >= ? AND create_time <= ?`
220+ }
221+ count, titles, result, err := qSql.QueryPageArray(db, true, condition, 0, 10)
222+ // ...
223+ // Or
224+ count, titles, result, err := qSql.QueryPageMap(db, true, condtion, 0, 10)
225+ // ...
226+ if err != nil {
227+ // ...
228+ }
208229}
209230```
210231
211232## Make a lazy tx commit
212233``` text
213234// commit the tx
214- mdb := db.GetCache("master")
215- tx, err := mdb.Begin()
216- if err != nil{
217- // ...
218- }
219- fn := func() error {
220- if err := tx.Exec("UPDATE testing SET name = ? WHERE id = ?", id); err != nil{
221- return err
222- }
223- return nil
224- }
225- if err := qsql.Commit(tx, fn); err != nil {
226- // ...
235+ func main() {
236+ mdb := qsql.GetCache("main")
237+ tx, err := mdb.Begin()
238+ if err != nil{
239+ // ...
240+ }
241+ fn := func() error {
242+ if err := tx.Exec("UPDATE testing SET name = ? WHERE id = ?", id); err != nil{
243+ return err
244+ }
245+ return nil
246+ }
247+ if err := qsql.Commit(tx, fn); err != nil {
248+ // ...
249+ }
227250}
228251```
0 commit comments