Add P versions of query exec funcs

- Update readme
This commit is contained in:
Patrick O'brien 2016-09-14 19:42:07 +10:00
parent 931f3d2de5
commit 7ce5ac18ac
2 changed files with 31 additions and 32 deletions

View file

@ -456,36 +456,8 @@ err := models.NewQuery(db, From("pilots")).All()
As you can see, [Query Mods](#query-mods) allow you to modify your queries, and [Finishers](#finishers)
allow you to execute the final action.
If you plan on executing the same query with the same values using the query builder,
you should do so like the following to utilize caching:
```go
// Instead of this:
for i := 0; i < 10; i++ {
pilots := models.Pilots(qm.Where("id > ?", 5), qm.Limit(5)).All()
}
// You should do this
query := models.Pilots(qm.Where("id > ?", 5), qm.Limit(5))
for i := 0; i < 10; i++ {
pilots := query.All()
}
// Every execution of All() after the first will use a cached version of
// the built query that short circuits the query builder all together.
// This allows you to save on performance.
// Just something to be aware of: query mods don't store pointers, so if
// your passed in variable's value changes, your generated query will not change.
```
Note: You will see exported `boil.SetX` methods in the boil package. These should not be used on query
objects because they will break caching. Unfortunately these had to be exported due to some circular
dependency issues, but they're not functionality we want exposed. If you want a different
query object, generate a new one.
Take a look at our [Relationships Query Building](#relationships) section for some additional query
building information.
We also generate query building helper methods for your relationships as well. Take a look at our
[Relationships Query Building](#relationships) section for some additional query building information.
### Query Mod System
@ -579,6 +551,9 @@ UpdateAll(models.M{"name": "John", "age": 23}) // Update all rows matching the b
DeleteAll() // Delete all rows matching the built query.
Exists() // Returns a bool indicating whether the row(s) for the built query exists.
Bind(&myObj) // Bind the results of a query to your own struct object.
ExecQuery() // Execute an SQL query that does not require any rows returned. Equivalent to `sql.Exec()`.
ExecQueryOne() // Execute an SQL query expected to return only a single row. Equivalent to `sql.QueryRow()`.
ExecQueryAll() // Execute an SQL query expected to return multiple rows. Equivalent to `sql.Query()`.
```
### Raw Query
@ -593,8 +568,10 @@ err := boil.SQL(db, "select * from pilots where id=$1", 5).Bind(&obj)
You can use your own structs or a generated struct as a parameter to Bind. Bind supports both
a single object for single row queries and a slice of objects for multiple row queries.
You also have `models.NewQuery()` at your disposal if you would still like to use [Query Build](#query-building)
but would like to build against a non-generated model.
`boil.SQL()` also has a method that can execute a query without binding to an object, if required.
You also have `models.NewQuery()` at your disposal if you would still like to use [Query Building](#query-building)
in combination with your own custom, non-generated model.
### Binding

View file

@ -126,6 +126,28 @@ func (q *Query) ExecQueryAll() (*sql.Rows, error) {
return q.executor.Query(qs, args...)
}
// ExecQueryP executes a query that does not need a row returned
// It will panic on error
func (q *Query) ExecQueryP() sql.Result {
res, err := q.ExecQuery()
if err != nil {
panic(WrapErr(err))
}
return res
}
// ExecQueryAllP executes the query for the All finisher and returns multiple rows
// It will panic on error
func (q *Query) ExecQueryAllP() *sql.Rows {
rows, err := q.ExecQueryAll()
if err != nil {
panic(WrapErr(err))
}
return rows
}
// SetExecutor on the query.
func SetExecutor(q *Query, exec Executor) {
q.executor = exec