GORM allows method chaining, so you can write code like this:
db.Where("name = ?", "jinzhu").Where("age = ?", 18).First(&user) |
There are three kinds of methods in GORM: Chain Method, Finisher Method, New Session Method.
Chain Method
Chain methods are methods to modify or add Clauses to current Statement, like:
Where, Select, Omit, Joins, Scopes, Preload, Raw (Raw can’t be used with other chainable methods to build SQL)…
Here is the full lists, also check out the SQL Builder for more details about Clauses.
Finisher Method
Finishers are immediate methods that execute registered callbacks, which will generate and execute SQL, like those methods:
Create, First, Find, Take, Save, Update, Delete, Scan, Row, Rows…
Check out the full lists here.
New Session Mode
After a new initialized *gorm.DB or a New Session Method, following methods call will create a new Statement instance instead of using the current one.
GORM defined Session, WithContext, Debug methods as New Session Method, refer Session for more details.
Let explain it with examples:
Example 1:
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) |
Example 2:
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) |
NOTE In example 2, the first query affected the second generated SQL, as GORM reused the
Statement. This might cause unexpected issues, refer to Goroutine Safety for how to avoid it.
Method Chain Safety/Goroutine Safety
Methods will create new Statement instances for new initialized *gorm.DB or after a New Session Method, so to reuse a *gorm.DB you need to make sure they are under New Session Mode, for example:
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) |