Skip to content

Commit 3dc0f65

Browse files
committed
added quick start
1 parent 973b507 commit 3dc0f65

File tree

5 files changed

+163
-65
lines changed

5 files changed

+163
-65
lines changed

adapter.go

-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ package grimoire
44
// accepts struct and query or changeset
55
// returns query string and arguments
66
type Adapter interface {
7-
Open(string) error
8-
Close() error
9-
107
Find(Query) (string, []interface{})
118
Insert(Query, map[string]interface{}) (string, []interface{})
129
Update(Query, map[string]interface{}) (string, []interface{})

adapter/mysql/adapter_test.go

+25-13
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ import (
1414
)
1515

1616
func init() {
17-
adapter := new(Adapter)
18-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
17+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
18+
if err != nil {
19+
panic(err)
20+
}
1921
defer adapter.Close()
2022

2123
adapter.Exec(`DROP TABLE IF EXISTS users;`, []interface{}{})
@@ -82,8 +84,10 @@ func dsn() string {
8284
}
8385

8486
func TestRepoQuery(t *testing.T) {
85-
adapter := new(Adapter)
86-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
87+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
88+
if err != nil {
89+
panic(err)
90+
}
8791
defer adapter.Close()
8892

8993
repo := grimoire.New(adapter)
@@ -133,8 +137,10 @@ func TestRepoQuery(t *testing.T) {
133137
}
134138

135139
func TestRepoFind(t *testing.T) {
136-
adapter := new(Adapter)
137-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
140+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
141+
if err != nil {
142+
panic(err)
143+
}
138144
defer adapter.Close()
139145

140146
stmt := "INSERT INTO users (name, created_at, updated_at) VALUES (?,?,?)"
@@ -174,8 +180,10 @@ func TestRepoFind(t *testing.T) {
174180
}
175181

176182
func TestRepoInsert(t *testing.T) {
177-
adapter := new(Adapter)
178-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
183+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
184+
if err != nil {
185+
panic(err)
186+
}
179187
defer adapter.Close()
180188

181189
user := User{}
@@ -185,7 +193,7 @@ func TestRepoInsert(t *testing.T) {
185193
"name": name,
186194
}, []string{"name", "created_at", "updated_at"})
187195

188-
err := grimoire.New(adapter).From("users").Insert(&user, ch)
196+
err = grimoire.New(adapter).From("users").Insert(&user, ch)
189197
assert.Nil(t, err)
190198
assert.NotEqual(t, 0, user.ID)
191199
assert.Equal(t, name, user.Name)
@@ -194,8 +202,10 @@ func TestRepoInsert(t *testing.T) {
194202
}
195203

196204
func TestRepoUpdate(t *testing.T) {
197-
adapter := new(Adapter)
198-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
205+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
206+
if err != nil {
207+
panic(err)
208+
}
199209
defer adapter.Close()
200210

201211
stmt := "INSERT INTO users (name, created_at, updated_at) VALUES (?,?,?)"
@@ -224,8 +234,10 @@ func TestRepoUpdate(t *testing.T) {
224234
}
225235

226236
func TestRepoDelete(t *testing.T) {
227-
adapter := new(Adapter)
228-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
237+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
238+
if err != nil {
239+
panic(err)
240+
}
229241
defer adapter.Close()
230242

231243
stmt := "INSERT INTO users (name, created_at, updated_at) VALUES (?,?,?)"

adapter/mysql/mysql.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ type Adapter struct {
1717

1818
var _ grimoire.Adapter = (*Adapter)(nil)
1919

20-
func (adapter *Adapter) Open(dsn string) error {
20+
func Open(dsn string) (*Adapter, error) {
2121
var err error
22+
adapter := &Adapter{}
2223
adapter.db, err = sql.Open("mysql", dsn)
23-
return err
24+
return adapter, err
2425
}
2526

2627
func (adapter *Adapter) Close() error {

adapter/mysql/mysql_test.go

+34-18
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ import (
1010
)
1111

1212
func TestTransactionCommit(t *testing.T) {
13-
adapter := new(Adapter)
14-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
13+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
14+
if err != nil {
15+
panic(err)
16+
}
1517
defer adapter.Close()
1618

1719
assert.Nil(t, adapter.Begin())
@@ -20,8 +22,10 @@ func TestTransactionCommit(t *testing.T) {
2022
}
2123

2224
func TestTransactionRollback(t *testing.T) {
23-
adapter := new(Adapter)
24-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
25+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
26+
if err != nil {
27+
panic(err)
28+
}
2529
defer adapter.Close()
2630

2731
assert.Nil(t, adapter.Begin())
@@ -30,24 +34,30 @@ func TestTransactionRollback(t *testing.T) {
3034
}
3135

3236
func TestTransactionCommitError(t *testing.T) {
33-
adapter := new(Adapter)
34-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
37+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
38+
if err != nil {
39+
panic(err)
40+
}
3541
defer adapter.Close()
3642

3743
assert.NotNil(t, adapter.Commit())
3844
}
3945

4046
func TestTransactionRollbackError(t *testing.T) {
41-
adapter := new(Adapter)
42-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
47+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
48+
if err != nil {
49+
panic(err)
50+
}
4351
defer adapter.Close()
4452

4553
assert.NotNil(t, adapter.Rollback())
4654
}
4755

4856
func TestQuery(t *testing.T) {
49-
adapter := new(Adapter)
50-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
57+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
58+
if err != nil {
59+
panic(err)
60+
}
5161
defer adapter.Close()
5262

5363
out := struct{}{}
@@ -68,19 +78,23 @@ func TestQuery(t *testing.T) {
6878
}
6979

7080
func TestQueryError(t *testing.T) {
71-
adapter := new(Adapter)
72-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
81+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
82+
if err != nil {
83+
panic(err)
84+
}
7385
defer adapter.Close()
7486

7587
out := struct{}{}
7688

77-
_, err := adapter.Query(&out, ";;", []interface{}{})
89+
_, err = adapter.Query(&out, ";;", []interface{}{})
7890
assert.NotNil(t, err)
7991
}
8092

8193
func TestExec(t *testing.T) {
82-
adapter := new(Adapter)
83-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
94+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
95+
if err != nil {
96+
panic(err)
97+
}
8498
defer adapter.Close()
8599

86100
// normal exec
@@ -104,11 +118,13 @@ func TestExec(t *testing.T) {
104118
}
105119

106120
func TestExecError(t *testing.T) {
107-
adapter := new(Adapter)
108-
adapter.Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
121+
adapter, err := Open(dsn() + "?charset=utf8&parseTime=True&loc=Local")
122+
if err != nil {
123+
panic(err)
124+
}
109125
defer adapter.Close()
110126

111-
_, _, err := adapter.Exec(";;", []interface{}{})
127+
_, _, err = adapter.Exec(";;", []interface{}{})
112128
assert.NotNil(t, err)
113129
}
114130

grimoire.go

+101-29
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,102 @@
1+
// Package grimoire is a data access layer and validation for go.
2+
//
3+
// Quick Start:
4+
// package main
5+
//
6+
// import (
7+
// "time"
8+
// "github.com/Fs02/grimoire"
9+
// . "github.com/Fs02/grimoire/c"
10+
// "github.com/Fs02/grimoire/adapter/mysql"
11+
// "github.com/Fs02/grimoire/changeset"
12+
// )
13+
//
14+
// type Product struct {
15+
// ID int
16+
// Name string
17+
// Price int
18+
// CreatedAt time.Time
19+
// UpdatedAt time.Time
20+
// }
21+
//
22+
// func ProductChangeset(product interface{}, params map[string]interface{}) *changeset.Changeset {
23+
// ch := changeset.Cast(product, params, []string{"name", "price"})
24+
// changeset.ValidateRequired(ch, []string{"name", price})
25+
// changeset.ValidateMin(ch, "price", 100)
26+
// return ch
27+
// }
28+
//
29+
// func main() {
30+
// // initialize mysql adapter
31+
// adapter, err := mysql.Open("root@(127.0.0.1:3306)/db?charset=utf8&parseTime=True&loc=Local")
32+
// if err != nil {
33+
// panic(err)
34+
// }
35+
// defer adapter.Close()
36+
//
37+
// // initializer grimoire's repo
38+
// repo := grimoire.New(adapter)
39+
//
40+
// var product Product
41+
//
42+
// // Changeset is used when creating or updating your data
43+
// ch := ProductChangeset(product, map[string]interface{}{
44+
// "name": "shampoo",
45+
// "price": 1000
46+
// })
47+
//
48+
// if ch.Error() != nil {
49+
// // do something
50+
// }
51+
//
52+
// // Create
53+
//
54+
// // Create products with changeset and return the result to &product
55+
// repo.From("products").MustCreate(&product, ch)
56+
//
57+
// // or create without returning
58+
// repo.From("products").MustCreate(nil, ch)
59+
//
60+
// // or create without changeset
61+
// repo.From("products").Set("name", "shampoo").Set("price", 1000).MustCreate(nil)
62+
//
63+
// // Read
64+
//
65+
// // Find a product with id 1
66+
// repo.From("products").Find(1).One(&product)
67+
//
68+
// // Find() is a shortcut for this
69+
// // this equal: SELECT * FROM products WHERE id=1 LIMIT 1;
70+
// const id = I("id")
71+
// repo.From("products").Where(Eq(id, 1)).One(&product)
72+
//
73+
// // More advanced query that returns array of results
74+
// // this equal: SELECT * FROM products WHERE (name="shampoo" AND price<1000) OR (name<>"shampoo" AND price>1000);
75+
// var products []Product
76+
// const name = I("name")
77+
// const price = I("price")
78+
// repo.From("products").Where(Eq(name, "shampoo"), Lt(price, 1000)).
79+
// OrWhere(Ne(name, "shampoo"), Gt(price, 1000)).
80+
// All(products)
81+
//
82+
// // Update
83+
//
84+
// // Update products with id=1
85+
// repo.From("products").Find(1).MustUpdate(&product, ch)
86+
//
87+
// // Update products without returning
88+
// repo.From("products").Find(1).MustUpdate(nil, ch)
89+
//
90+
// // Or Update products without changset
91+
// repo.From("products").Find(1).Set("name", "shampoo").Set("price", 1000).MustUpdate(nil)
92+
//
93+
// // If no condition is specified, all records will be updated
94+
// repo.From("products").MustUpdate(&product, ch)
95+
//
96+
// // Delete
97+
// // Delete Product with id=1
98+
// repo.From("products").Find(1).MustDelete()
99+
// // If no condition is specified, all records will be deleted
100+
// repo.From("products").MustDelete()
101+
// }
1102
package grimoire
2-
3-
// db := grimoire.New("mysql://blabla")
4-
// db.From("books").Find(&book, 1)
5-
// db.From("books").All(&books)
6-
// db.From("books").Where("1 > ?", 2).All(&books)
7-
// db.From("books").Where("1 > ?", 2).UpdateAll(&books)
8-
// db.From("books").Join("").Where("1 > ?", 2).All(&books)
9-
10-
// err := db.From("books").Find(1).One(&book) // automatically limit 1
11-
// err := db.From("books").Find(1).All(&book)
12-
// err, count := db.From("books").Find(1).Count() // sql adapter automatically select count(*)
13-
14-
// err := db.From("books").Insert(&book, changes)
15-
// err := db.From("books").Find(1).Update(&book, changes)
16-
// err := db.From("books").Find(1).Replace(&book)
17-
// err := db.From("books").Find(1).Delete()
18-
19-
// err := db.From("books").Find(1).Preload("Users", db.From("users")).All(&book)
20-
21-
// Find(interface{}) // is short hand, automatically where(id = ?, value)
22-
23-
// err := repo.Transaction(func(r Repo) {
24-
// err := r.From("blablabla").Find("blablabla")
25-
// if err != nil {
26-
// return err
27-
// }
28-
// r.Update("blablabla").Find("blablabla")
29-
// return nil
30-
// })

0 commit comments

Comments
 (0)