This repository was archived by the owner on Sep 3, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathqsql.go
More file actions
139 lines (127 loc) · 3.29 KB
/
qsql.go
File metadata and controls
139 lines (127 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package main
import (
"fmt"
"github.com/gwaylib/database"
"github.com/gwaylib/errors"
_ "github.com/mattn/go-sqlite3"
)
type TestingUser struct {
ID int64 `db:"id,auto_increment"` // auto_increment or autoincrement
UserName string `db:"username"`
Passwd string `db:"passwd"`
}
func main() {
mdb, _ := database.Open("sqlite3", ":memory:")
defer database.Close(mdb)
// create table
if _, err := database.Exec(mdb,
`CREATE TABLE user (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"created_at" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
"username" VARCHAR(32) NOT NULL UNIQUE,
"passwd" VARCHAR(128) NOT NULL
);`); err != nil {
panic(err)
}
// std insert
if _, err := database.Exec(mdb, "INSERT INTO user(username,passwd)VALUES(?,?)", "t1", "t1"); err != nil {
panic(err)
}
// reflect insert
newUser := &TestingUser{UserName: "t2", Passwd: "t2"}
if _, err := database.InsertStruct(mdb, newUser, "user"); err != nil {
panic(err)
}
if newUser.ID == 0 {
panic("expect newUser.ID > 0")
}
// std query
var id int64
var username, passwd string
if err := database.QueryRow(mdb, "SELECT id, username, passwd FROM user WHERE username=?", "t1").Scan(&id, &username, &passwd); err != nil {
panic(err)
}
if username != "t1" && passwd != "t1" {
panic(username + "," + passwd)
}
if id == 0 {
panic(id)
}
// reflect query
// query struct data
expectUser := &TestingUser{}
if err := database.QueryStruct(mdb, expectUser, "SELECT * FROM user WHERE username=?", "t1"); err != nil {
panic(err)
}
if expectUser.UserName != "t1" && expectUser.Passwd != "t1" {
panic("data not match")
}
users := []*TestingUser{}
if err := database.QueryStructs(mdb, &users, "SELECT * FROM user LIMIT 2"); err != nil {
panic(err)
}
if len(users) != 2 {
panic("expect len==2")
}
// query elememt data
pwd := ""
if err := database.QueryElem(mdb, &pwd, "SELECT passwd FROM user WHERE username=?", "t1"); err != nil {
panic(err)
}
if pwd != "t1" {
panic(pwd)
}
ids := []int64{}
if err := database.QueryElems(mdb, &ids, "SELECT id FROM user LIMIT 2"); err != nil {
panic(err)
}
if len(ids) != 2 {
panic("expect len==2")
}
fmt.Printf("ids:%+v\n", ids)
// query data in string
// table type
titles, data, err := database.QueryPageArr(mdb, "SELECT * FROM user LIMIT 10")
if err != nil {
panic(err)
}
fmt.Printf("PageArr title:%+v\n", titles)
fmt.Printf("PageArr data: %+v\n", data)
// map type
titles, mData, err := database.QueryPageMap(mdb, "SELECT * FROM user LIMIT 10")
if err != nil {
panic(err)
}
fmt.Printf("PageMap title:%+v\n", titles)
fmt.Printf("PageMap data: %+v\n", mData)
// executer for tx
tx, err := mdb.Begin()
if err != nil {
panic(err)
}
txUsers := []TestingUser{
{UserName: "t3", Passwd: "t3"},
{UserName: "t4", Passwd: "t4"},
}
for _, u := range txUsers {
if _, err := database.InsertStruct(tx, &u, "user"); err != nil {
println(errors.As(err))
database.Rollback(tx)
return
}
}
if err := tx.Commit(); err != nil {
println(errors.As(err))
database.Rollback(tx)
return
}
// excute for stmt
stmt, err := mdb.Prepare("SELECT COUNT(*) FROM user WHERE username=?")
count := 0
if err := stmt.QueryRow("t3").Scan(&count); err != nil {
panic(err)
}
if count != 1 {
panic(errors.New("need count==1").As(count))
}
}