Skip to content

Commit 86c60f3

Browse files
committed
Merge branch 'master' of github.com:kisielk/sqlstruct
2 parents c9077e5 + dae28ed commit 86c60f3

File tree

1 file changed

+59
-71
lines changed

1 file changed

+59
-71
lines changed

sqlstruct.go

Lines changed: 59 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -14,82 +14,71 @@ embedded structs and are recursively scanned.
1414
1515
For 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
4434
Aliased tables in a SQL statement may be scanned into a specific structure identified
4535
by 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
*/
9483
package 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.
115104
var 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.
217205
func ColumnsAliased(s interface{}, alias string) string {

0 commit comments

Comments
 (0)