@@ -14,82 +14,71 @@ embedded structs and are recursively scanned.
1414
1515For example:
1616
17- type T1 struct {
18- F4 string `sql:"field4"`
19- }
17+ type T struct {
18+ F1 string
19+ F2 string `sql:"field2"`
20+ F3 string `sql:"-"`
21+ }
2022
21- type T2 struct {
22- F5 string `sql:"field5"`
23- }
24-
25- type T struct {
26- F1 string
27- F2 string `sql:"field2"`
28- F3 string `sql:"-"`
29- fieldT1 T1 `sql:",recurse"`
30- T2
31- }
23+ rows, err := db.Query(fmt.Sprintf("SELECT %s FROM tablename", sqlstruct.Columns(T{})))
24+ ...
3225
33- rows, err := db.Query(fmt.Sprintf("SELECT %s FROM tablename", sqlstruct.Columns(T{})))
34- ...
26+ for rows.Next() {
27+ var t T
28+ err = sqlstruct.Scan(&t, rows)
29+ ...
30+ }
3531
36- for rows.Next() {
37- var t T
38- err = sqlstruct.Scan(&t, rows)
39- ...
40- }
41-
42- err = rows.Err() // get any errors encountered during iteration
32+ err = rows.Err() // get any errors encountered during iteration
4333
4434Aliased tables in a SQL statement may be scanned into a specific structure identified
4535by the same alias, using the ColumnsAliased and ScanAliased functions:
4636
47- type User struct {
48- Id int `sql:"id"`
49- Username string `sql:"username"`
50- Email string `sql:"address"`
51- Name string `sql:"name"`
52- HomeAddress *Address `sql:"-"`
53- }
54-
55- type Address struct {
56- Id int `sql:"id"`
57- City string `sql:"city"`
58- Street string `sql:"address"`
59- }
60-
61- ...
37+ type User struct {
38+ Id int `sql:"id"`
39+ Username string `sql:"username"`
40+ Email string `sql:"address"`
41+ Name string `sql:"name"`
42+ HomeAddress *Address `sql:"-"`
43+ }
44+
45+ type Address struct {
46+ Id int `sql:"id"`
47+ City string `sql:"city"`
48+ Street string `sql:"address"`
49+ }
50+
51+ ...
52+
53+ var user User
54+ var address Address
55+ sql := `
56+ SELECT %s, %s FROM users AS u
57+ INNER JOIN address AS a ON a.id = u.address_id
58+ WHERE u.username = ?
59+ `
60+ sql = fmt.Sprintf(sql, sqlstruct.ColumnsAliased(*user, "u"), sqlstruct.ColumnsAliased(*address, "a"))
61+ rows, err := db.Query(sql, "gedi")
62+ if err != nil {
63+ log.Fatal(err)
64+ }
65+ defer rows.Close()
66+ if rows.Next() {
67+ err = sqlstruct.ScanAliased(&user, rows, "u")
68+ if err != nil {
69+ log.Fatal(err)
70+ }
71+ err = sqlstruct.ScanAliased(&address, rows, "a")
72+ if err != nil {
73+ log.Fatal(err)
74+ }
75+ user.HomeAddress = address
76+ }
77+ fmt.Printf("%+v", *user)
78+ // output: "{Id:1 Username:gedi Email:[email protected] Name:Gedas HomeAddress:0xc21001f570}" 79+ fmt.Printf("%+v", *user.HomeAddress)
80+ // output: "{Id:2 City:Vilnius Street:Plento 34}"
6281
63- var user User
64- var address Address
65- sql := `
66-
67- SELECT %s, %s FROM users AS u
68- INNER JOIN address AS a ON a.id = u.address_id
69- WHERE u.username = ?
70- `
71-
72- sql = fmt.Sprintf(sql, sqlstruct.ColumnsAliased(*user, "u"), sqlstruct.ColumnsAliased(*address, "a"))
73- rows, err := db.Query(sql, "gedi")
74- if err != nil {
75- log.Fatal(err)
76- }
77- defer rows.Close()
78- if rows.Next() {
79- err = sqlstruct.ScanAliased(&user, rows, "u")
80- if err != nil {
81- log.Fatal(err)
82- }
83- err = sqlstruct.ScanAliased(&address, rows, "a")
84- if err != nil {
85- log.Fatal(err)
86- }
87- user.HomeAddress = address
88- }
89- fmt.Printf("%+v", *user)
90- // output: "{Id:1 Username:gedi Email:[email protected] Name:Gedas HomeAddress:0xc21001f570}" 91- fmt.Printf("%+v", *user.HomeAddress)
92- // output: "{Id:2 City:Vilnius Street:Plento 34}"
9382*/
9483package sqlstruct
9584
@@ -109,7 +98,7 @@ import (
10998// The default mapper converts field names to lower case. If instead you would prefer
11099// field names converted to snake case, simply assign sqlstruct.ToSnakeCase to the variable:
111100//
112- // sqlstruct.NameMapper = sqlstruct.ToSnakeCase
101+ // sqlstruct.NameMapper = sqlstruct.ToSnakeCase
113102//
114103// Alternatively for a custom mapping, any func(string) string can be used instead.
115104var NameMapper func (string ) string = strings .ToLower
@@ -210,8 +199,7 @@ func Columns(s interface{}) string {
210199// given alias.
211200//
212201// For each field in the given struct it will generate a statement like:
213- //
214- // alias.field AS alias_field
202+ // alias.field AS alias_field
215203//
216204// It is intended to be used in conjunction with the ScanAliased function.
217205func ColumnsAliased (s interface {}, alias string ) string {
0 commit comments