Merge pull request #37 from elgris/select_case

Support of CASE operator in SELECT query
tree: ebdbeb1eed75b9a6ae5ed69c50245ce37641ae0f
  1. .gitignore
  2. .travis.yml
  3. case.go
  4. case_test.go
  5. delete.go
  6. delete_test.go
  7. expr.go
  8. expr_test.go
  9. insert.go
  10. insert_test.go
  11. part.go
  12. placeholder.go
  13. placeholder_test.go
  14. README.md
  15. row.go
  16. row_test.go
  17. select.go
  18. select_test.go
  19. squirrel.go
  20. squirrel_test.go
  21. statement.go
  22. statement_test.go
  23. stmtcacher.go
  24. stmtcacher_test.go
  25. update.go
  26. update_test.go
  27. where.go
  28. where_test.go
README.md

Squirrel - fluent SQL generator for Go

import "github.com/lann/squirrel"

GoDoc Build Status

Squirrel is not an ORM.

Squirrel helps you build SQL queries from composable parts:

import sq "github.com/lann/squirrel"

users := sq.Select("*").From("users").Join("emails USING (email_id)")

active := users.Where(sq.Eq{"deleted_at": nil})

sql, args, err := active.ToSql()

sql == "SELECT * FROM users JOIN emails USING (email_id) WHERE deleted_at IS NULL"
sql, args, err := sq.
    Insert("users").Columns("name", "age").
    Values("moe", 13).Values("larry", sq.Expr("? + 5", 12)).
    ToSql()

sql == "INSERT INTO users (name,age) VALUES (?,?),(?,? + 5)"

Squirrel can also execute queries directly:

stooges := users.Where(sq.Eq{"username": []string{"moe", "larry", "curly", "shemp"}})
three_stooges := stooges.Limit(3)
rows, err := three_stooges.RunWith(db).Query()

// Behaves like:
rows, err := db.Query("SELECT * FROM users WHERE username IN (?,?,?,?) LIMIT 3",
                      "moe", "larry", "curly", "shemp")

Squirrel makes conditional query building a breeze:

if len(q) > 0 {
    users = users.Where("name LIKE ?", fmt.Sprint("%", q, "%"))
}

Squirrel wants to make your life easier:

// StmtCache caches Prepared Stmts for you
dbCache := sq.NewStmtCacher(db)

// StatementBuilder keeps your syntax neat
mydb := sq.StatementBuilder.RunWith(dbCache)
select_users := mydb.Select("*").From("users")

Squirrel loves PostgreSQL:

psql := sq.StatementBuilder.PlaceholderFormat(Dollar)

// You use question marks for placeholders...
sql, _, _ := psql.Select("*").From("elephants").Where("name IN (?,?)", "Dumbo", "Verna")

/// ...squirrel replaces them using PlaceholderFormat.
sql == "SELECT * FROM elephants WHERE name IN ($1,$2)"


/// You can retrieve id ...
query := sq.Insert("nodes").
    Columns("uuid", "type", "data").
    Values(node.Uuid, node.Type, node.Data).
    Suffix("RETURNING \"id\"").
    RunWith(m.db).
    PlaceholderFormat(sq.Dollar)

query.QueryRow().Scan(&node.id)

You can escape question mask by inserting two question marks:

SELECT * FROM nodes WHERE meta->'format' ??| array[?,?]

will generate with the Dollar Placeholder:

SELECT * FROM nodes WHERE meta->'format' ?| array[$1,$2] 

License

Squirrel is released under the MIT License.