119 lines
3.1 KiB
Markdown
119 lines
3.1 KiB
Markdown
# Squirrel - fluent SQL generator for Go
|
|
|
|
```go
|
|
import "gopkg.in/Masterminds/squirrel.v1"
|
|
```
|
|
or if you prefer using `master` (which may be arbitrarily ahead of or behind `v1`):
|
|
|
|
**NOTE:** as of Go 1.6, `go get` correctly clones the Github default branch (which is `v1` in this repo).
|
|
```go
|
|
import "github.com/Masterminds/squirrel"
|
|
```
|
|
|
|
[](https://godoc.org/github.com/Masterminds/squirrel)
|
|
[](https://travis-ci.org/Masterminds/squirrel)
|
|
|
|
_**Note:** This project has moved from `github.com/lann/squirrel` to
|
|
`github.com/Masterminds/squirrel`. Lann remains the architect of the
|
|
project, but we're helping him curate.
|
|
|
|
**Squirrel is not an ORM.** For an application of Squirrel, check out
|
|
[structable, a table-struct mapper](https://github.com/technosophos/structable)
|
|
|
|
|
|
Squirrel helps you build SQL queries from composable parts:
|
|
|
|
```go
|
|
import sq "github.com/Masterminds/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"
|
|
```
|
|
|
|
```go
|
|
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:
|
|
|
|
```go
|
|
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:
|
|
|
|
```go
|
|
if len(q) > 0 {
|
|
users = users.Where("name LIKE ?", fmt.Sprint("%", q, "%"))
|
|
}
|
|
```
|
|
|
|
Squirrel wants to make your life easier:
|
|
|
|
```go
|
|
// 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:
|
|
|
|
```go
|
|
psql := sq.StatementBuilder.PlaceholderFormat(sq.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:
|
|
|
|
```sql
|
|
SELECT * FROM nodes WHERE meta->'format' ??| array[?,?]
|
|
```
|
|
|
|
will generate with the Dollar Placeholder:
|
|
|
|
```sql
|
|
SELECT * FROM nodes WHERE meta->'format' ?| array[$1,$2]
|
|
```
|
|
|
|
|
|
|
|
## License
|
|
|
|
Squirrel is released under the
|
|
[MIT License](http://www.opensource.org/licenses/MIT).
|