diff --git a/README.md b/README.md
index fa52f3e..9165fb3 100644
--- a/README.md
+++ b/README.md
@@ -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
 
diff --git a/boil/query.go b/boil/query.go
index 5ae5fab..bf82215 100644
--- a/boil/query.go
+++ b/boil/query.go
@@ -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