Skip to content

Commit 3c944b9

Browse files
authored
Update documentation and examples for some SelectBuilder methods and Eq (#242)
1 parent 31b423b commit 3c944b9

File tree

4 files changed

+175
-2
lines changed

4 files changed

+175
-2
lines changed

expr.go

-2
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,6 @@ func (e aliasExpr) ToSql() (sql string, args []interface{}, err error) {
134134
}
135135

136136
// Eq is syntactic sugar for use with Where/Having/Set methods.
137-
// Ex:
138-
// .Where(Eq{"id": 1})
139137
type Eq map[string]interface{}
140138

141139
func (eq Eq) toSQL(useNotOpr bool) (sql string, args []interface{}, err error) {

expr_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -456,3 +456,9 @@ func TestExprRecursion(t *testing.T) {
456456
assert.Equal(t, expectedArgs, args)
457457
}
458458
}
459+
460+
func ExampleEq() {
461+
Select("id", "created", "first_name").From("users").Where(Eq{
462+
"company": 20,
463+
})
464+
}

select.go

+3
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,9 @@ func (b SelectBuilder) PlaceholderFormat(f PlaceholderFormat) SelectBuilder {
184184
// Runner methods
185185

186186
// RunWith sets a Runner (like database/sql.DB) to be used with e.g. Exec.
187+
// For most cases runner will be a database connection.
188+
//
189+
// Internally we use this to mock out the database connection for testing.
187190
func (b SelectBuilder) RunWith(runner BaseRunner) SelectBuilder {
188191
return setRunWith(b, runner).(SelectBuilder)
189192
}

select_test.go

+166
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package squirrel
22

33
import (
4+
"database/sql"
5+
"fmt"
6+
"log"
47
"testing"
8+
"time"
59

610
"github.com/stretchr/testify/assert"
711
)
@@ -242,3 +246,165 @@ func TestSelectWithEmptyStringWhereClause(t *testing.T) {
242246
assert.NoError(t, err)
243247
assert.Equal(t, "SELECT * FROM users", sql)
244248
}
249+
250+
func ExampleSelect() {
251+
Select("id", "created", "first_name").From("users") // ... continue building up your query
252+
253+
// sql methods in select columns are ok
254+
Select("first_name", "count(*)").From("users")
255+
256+
// column aliases are ok too
257+
Select("first_name", "count(*) as n_users").From("users")
258+
}
259+
260+
func ExampleSelectBuilder_From() {
261+
Select("id", "created", "first_name").From("users") // ... continue building up your query
262+
}
263+
264+
func ExampleSelectBuilder_Where() {
265+
companyId := 20
266+
Select("id", "created", "first_name").From("users").Where("company = ?", companyId)
267+
}
268+
269+
func ExampleSelectBuilder_Where_helpers() {
270+
companyId := 20
271+
272+
Select("id", "created", "first_name").From("users").Where(Eq{
273+
"company": companyId,
274+
})
275+
276+
Select("id", "created", "first_name").From("users").Where(GtOrEq{
277+
"created": time.Now().AddDate(0, 0, -7),
278+
})
279+
280+
Select("id", "created", "first_name").From("users").Where(And{
281+
GtOrEq{
282+
"created": time.Now().AddDate(0, 0, -7),
283+
},
284+
Eq{
285+
"company": companyId,
286+
},
287+
})
288+
}
289+
290+
func ExampleSelectBuilder_Where_multiple() {
291+
companyId := 20
292+
293+
// multiple where's are ok
294+
295+
Select("id", "created", "first_name").
296+
From("users").
297+
Where("company = ?", companyId).
298+
Where(GtOrEq{
299+
"created": time.Now().AddDate(0, 0, -7),
300+
})
301+
}
302+
303+
func ExampleSelectBuilder_FromSelect() {
304+
usersByCompany := Select("company", "count(*) as n_users").From("users").GroupBy("company")
305+
query := Select("company.id", "company.name", "users_by_company.n_users").
306+
FromSelect(usersByCompany, "users_by_company").
307+
Join("company on company.id = users_by_company.company")
308+
309+
sql, _, _ := query.ToSql()
310+
fmt.Println(sql)
311+
312+
// Output: SELECT company.id, company.name, users_by_company.n_users
313+
// FROM (
314+
// SELECT company, count(*) as n_users
315+
// FROM users GROUP BY company
316+
// ) AS users_by_company
317+
// JOIN company on company.id = users_by_company.company
318+
}
319+
320+
func ExampleSelectBuilder_Columns() {
321+
query := Select("id").Columns("created", "first_name").From("users")
322+
323+
sql, _, _ := query.ToSql()
324+
fmt.Println(sql)
325+
// Output: SELECT id, created, first_name FROM users
326+
}
327+
328+
func ExampleSelectBuilder_Columns_order() {
329+
// out of order is ok too
330+
query := Select("id").Columns("created").From("users").Columns("first_name")
331+
332+
sql, _, _ := query.ToSql()
333+
fmt.Println(sql)
334+
// Output: SELECT id, created, first_name FROM users
335+
}
336+
337+
func ExampleSelectBuilder_Scan() {
338+
339+
var db *sql.DB
340+
341+
query := Select("id", "created", "first_name").From("users")
342+
query = query.RunWith(db)
343+
344+
var id int
345+
var created time.Time
346+
var firstName string
347+
348+
if err := query.Scan(&id, &created, &firstName); err != nil {
349+
log.Println(err)
350+
return
351+
}
352+
}
353+
354+
func ExampleSelectBuilder_ScanContext() {
355+
356+
var db *sql.DB
357+
358+
query := Select("id", "created", "first_name").From("users")
359+
query = query.RunWith(db)
360+
361+
var id int
362+
var created time.Time
363+
var firstName string
364+
365+
if err := query.ScanContext(ctx, &id, &created, &firstName); err != nil {
366+
log.Println(err)
367+
return
368+
}
369+
}
370+
371+
func ExampleSelectBuilder_RunWith() {
372+
373+
var db *sql.DB
374+
375+
query := Select("id", "created", "first_name").From("users").RunWith(db)
376+
377+
var id int
378+
var created time.Time
379+
var firstName string
380+
381+
if err := query.Scan(&id, &created, &firstName); err != nil {
382+
log.Println(err)
383+
return
384+
}
385+
}
386+
387+
func ExampleSelectBuilder_ToSql() {
388+
389+
var db *sql.DB
390+
391+
query := Select("id", "created", "first_name").From("users")
392+
393+
sql, args, err := query.ToSql()
394+
if err != nil {
395+
log.Println(err)
396+
return
397+
}
398+
399+
rows, err := db.Query(sql, args...)
400+
if err != nil {
401+
log.Println(err)
402+
return
403+
}
404+
405+
defer rows.Close()
406+
407+
for rows.Next() {
408+
// scan...
409+
}
410+
}

0 commit comments

Comments
 (0)