|
|
|
@ -25,7 +25,7 @@ The fantastic ORM library for Golang, aims to be developer friendly.
|
|
|
|
|
## Install
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
go get -u github.com/jinzhu/gorm
|
|
|
|
|
go get -u github.com/embroker/gorm
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Define Models (Structs)
|
|
|
|
@ -104,7 +104,7 @@ type User struct {
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
import (
|
|
|
|
|
"github.com/jinzhu/gorm"
|
|
|
|
|
"github.com/embroker/gorm"
|
|
|
|
|
_ "github.com/lib/pq"
|
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
|
|
|
_ "github.com/mattn/go-sqlite3"
|
|
|
|
@ -164,10 +164,10 @@ db.NewRecord(user) // => return `false` after `user` created
|
|
|
|
|
|
|
|
|
|
// Associations will be inserted automatically when save the record
|
|
|
|
|
user := User{
|
|
|
|
|
Name: "jinzhu",
|
|
|
|
|
Name: "embroker",
|
|
|
|
|
BillingAddress: Address{Address1: "Billing Address - Address 1"},
|
|
|
|
|
ShippingAddress: Address{Address1: "Shipping Address - Address 1"},
|
|
|
|
|
Emails: []Email{{Email: "jinzhu@example.com"}, {Email: "jinzhu-2@example@example.com"}},
|
|
|
|
|
Emails: []Email{{Email: "embroker@example.com"}, {Email: "embroker-2@example@example.com"}},
|
|
|
|
|
Languages: []Language{{Name: "ZH"}, {Name: "EN"}},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -175,9 +175,9 @@ db.Create(&user)
|
|
|
|
|
//// BEGIN TRANSACTION;
|
|
|
|
|
//// INSERT INTO "addresses" (address1) VALUES ("Billing Address - Address 1");
|
|
|
|
|
//// INSERT INTO "addresses" (address1) VALUES ("Shipping Address - Address 1");
|
|
|
|
|
//// INSERT INTO "users" (name,billing_address_id,shipping_address_id) VALUES ("jinzhu", 1, 2);
|
|
|
|
|
//// INSERT INTO "emails" (user_id,email) VALUES (111, "jinzhu@example.com");
|
|
|
|
|
//// INSERT INTO "emails" (user_id,email) VALUES (111, "jinzhu-2@example.com");
|
|
|
|
|
//// INSERT INTO "users" (name,billing_address_id,shipping_address_id) VALUES ("embroker", 1, 2);
|
|
|
|
|
//// INSERT INTO "emails" (user_id,email) VALUES (111, "embroker@example.com");
|
|
|
|
|
//// INSERT INTO "emails" (user_id,email) VALUES (111, "embroker-2@example.com");
|
|
|
|
|
//// INSERT INTO "languages" ("name") VALUES ('ZH');
|
|
|
|
|
//// INSERT INTO user_languages ("user_id","language_id") VALUES (111, 1);
|
|
|
|
|
//// INSERT INTO "languages" ("name") VALUES ('EN');
|
|
|
|
@ -211,23 +211,23 @@ db.First(&user, 10)
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
// Get the first matched record
|
|
|
|
|
db.Where("name = ?", "jinzhu").First(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name = 'jinzhu' limit 1;
|
|
|
|
|
db.Where("name = ?", "embroker").First(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name = 'embroker' limit 1;
|
|
|
|
|
|
|
|
|
|
// Get all matched records
|
|
|
|
|
db.Where("name = ?", "jinzhu").Find(&users)
|
|
|
|
|
//// SELECT * FROM users WHERE name = 'jinzhu';
|
|
|
|
|
db.Where("name = ?", "embroker").Find(&users)
|
|
|
|
|
//// SELECT * FROM users WHERE name = 'embroker';
|
|
|
|
|
|
|
|
|
|
db.Where("name <> ?", "jinzhu").Find(&users)
|
|
|
|
|
db.Where("name <> ?", "embroker").Find(&users)
|
|
|
|
|
|
|
|
|
|
// IN
|
|
|
|
|
db.Where("name in (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)
|
|
|
|
|
db.Where("name in (?)", []string{"embroker", "embroker 2"}).Find(&users)
|
|
|
|
|
|
|
|
|
|
// LIKE
|
|
|
|
|
db.Where("name LIKE ?", "%jin%").Find(&users)
|
|
|
|
|
|
|
|
|
|
// AND
|
|
|
|
|
db.Where("name = ? and age >= ?", "jinzhu", "22").Find(&users)
|
|
|
|
|
db.Where("name = ? and age >= ?", "embroker", "22").Find(&users)
|
|
|
|
|
|
|
|
|
|
// Time
|
|
|
|
|
db.Where("updated_at > ?", lastWeek).Find(&users)
|
|
|
|
@ -239,12 +239,12 @@ db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
// Struct
|
|
|
|
|
db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;
|
|
|
|
|
db.Where(&User{Name: "embroker", Age: 20}).First(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name = "embroker" AND age = 20 LIMIT 1;
|
|
|
|
|
|
|
|
|
|
// Map
|
|
|
|
|
db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users)
|
|
|
|
|
//// SELECT * FROM users WHERE name = "jinzhu" AND age = 20;
|
|
|
|
|
db.Where(map[string]interface{}{"name": "embroker", "age": 20}).Find(&users)
|
|
|
|
|
//// SELECT * FROM users WHERE name = "embroker" AND age = 20;
|
|
|
|
|
|
|
|
|
|
// Slice of primary keys
|
|
|
|
|
db.Where([]int64{20, 21, 22}).Find(&users)
|
|
|
|
@ -254,12 +254,12 @@ db.Where([]int64{20, 21, 22}).Find(&users)
|
|
|
|
|
### Query With Not
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
db.Not("name", "jinzhu").First(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name <> "jinzhu" LIMIT 1;
|
|
|
|
|
db.Not("name", "embroker").First(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name <> "embroker" LIMIT 1;
|
|
|
|
|
|
|
|
|
|
// Not In
|
|
|
|
|
db.Not("name", []string{"jinzhu", "jinzhu 2"}).Find(&users)
|
|
|
|
|
//// SELECT * FROM users WHERE name NOT IN ("jinzhu", "jinzhu 2");
|
|
|
|
|
db.Not("name", []string{"embroker", "embroker 2"}).Find(&users)
|
|
|
|
|
//// SELECT * FROM users WHERE name NOT IN ("embroker", "embroker 2");
|
|
|
|
|
|
|
|
|
|
// Not In slice of primary keys
|
|
|
|
|
db.Not([]int64{1,2,3}).First(&user)
|
|
|
|
@ -269,12 +269,12 @@ db.Not([]int64{}).First(&user)
|
|
|
|
|
//// SELECT * FROM users;
|
|
|
|
|
|
|
|
|
|
// Plain SQL
|
|
|
|
|
db.Not("name = ?", "jinzhu").First(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE NOT(name = "jinzhu");
|
|
|
|
|
db.Not("name = ?", "embroker").First(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE NOT(name = "embroker");
|
|
|
|
|
|
|
|
|
|
// Struct
|
|
|
|
|
db.Not(User{Name: "jinzhu"}).First(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name <> "jinzhu";
|
|
|
|
|
db.Not(User{Name: "embroker"}).First(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name <> "embroker";
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Query With Inline Condition
|
|
|
|
@ -285,11 +285,11 @@ db.First(&user, 23)
|
|
|
|
|
//// SELECT * FROM users WHERE id = 23 LIMIT 1;
|
|
|
|
|
|
|
|
|
|
// Plain SQL
|
|
|
|
|
db.Find(&user, "name = ?", "jinzhu")
|
|
|
|
|
//// SELECT * FROM users WHERE name = "jinzhu";
|
|
|
|
|
db.Find(&user, "name = ?", "embroker")
|
|
|
|
|
//// SELECT * FROM users WHERE name = "embroker";
|
|
|
|
|
|
|
|
|
|
db.Find(&users, "name <> ? AND age > ?", "jinzhu", 20)
|
|
|
|
|
//// SELECT * FROM users WHERE name <> "jinzhu" AND age > 20;
|
|
|
|
|
db.Find(&users, "name <> ? AND age > ?", "embroker", 20)
|
|
|
|
|
//// SELECT * FROM users WHERE name <> "embroker" AND age > 20;
|
|
|
|
|
|
|
|
|
|
// Struct
|
|
|
|
|
db.Find(&users, User{Age: 20})
|
|
|
|
@ -307,11 +307,11 @@ db.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&users)
|
|
|
|
|
//// SELECT * FROM users WHERE role = 'admin' OR role = 'super_admin';
|
|
|
|
|
|
|
|
|
|
// Struct
|
|
|
|
|
db.Where("name = 'jinzhu'").Or(User{Name: "jinzhu 2"}).Find(&users)
|
|
|
|
|
//// SELECT * FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2';
|
|
|
|
|
db.Where("name = 'embroker'").Or(User{Name: "embroker 2"}).Find(&users)
|
|
|
|
|
//// SELECT * FROM users WHERE name = 'embroker' OR name = 'embroker 2';
|
|
|
|
|
|
|
|
|
|
// Map
|
|
|
|
|
db.Where("name = 'jinzhu'").Or(map[string]interface{}{"name": "jinzhu 2"}).Find(&users)
|
|
|
|
|
db.Where("name = 'embroker'").Or(map[string]interface{}{"name": "embroker 2"}).Find(&users)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Query Chains
|
|
|
|
@ -319,10 +319,10 @@ db.Where("name = 'jinzhu'").Or(map[string]interface{}{"name": "jinzhu 2"}).Find(
|
|
|
|
|
Gorm has a chainable API, you could use it like this
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
db.Where("name <> ?","jinzhu").Where("age >= ? and role <> ?",20,"admin").Find(&users)
|
|
|
|
|
//// SELECT * FROM users WHERE name <> 'jinzhu' AND age >= 20 AND role <> 'admin';
|
|
|
|
|
db.Where("name <> ?","embroker").Where("age >= ? and role <> ?",20,"admin").Find(&users)
|
|
|
|
|
//// SELECT * FROM users WHERE name <> 'embroker' AND age >= 20 AND role <> 'admin';
|
|
|
|
|
|
|
|
|
|
db.Where("role = ?", "admin").Or("role = ?", "super_admin").Not("name = ?", "jinzhu").Find(&users)
|
|
|
|
|
db.Where("role = ?", "admin").Or("role = ?", "super_admin").Not("name = ?", "embroker").Find(&users)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Preloading (Eager loading)
|
|
|
|
@ -359,13 +359,13 @@ db.Preload("Orders", "state = ?", "paid").Preload("Orders.OrderItems").Find(&use
|
|
|
|
|
```go
|
|
|
|
|
// Update an existing struct
|
|
|
|
|
db.First(&user)
|
|
|
|
|
user.Name = "jinzhu 2"
|
|
|
|
|
user.Name = "embroker 2"
|
|
|
|
|
user.Age = 100
|
|
|
|
|
db.Save(&user)
|
|
|
|
|
//// UPDATE users SET name='jinzhu 2', age=100, updated_at = '2013-11-17 21:34:10' WHERE id=111;
|
|
|
|
|
//// UPDATE users SET name='embroker 2', age=100, updated_at = '2013-11-17 21:34:10' WHERE id=111;
|
|
|
|
|
|
|
|
|
|
db.Where("active = ?", true).Save(&user)
|
|
|
|
|
//// UPDATE users SET name='jinzhu 2', age=100, updated_at = '2013-11-17 21:34:10' WHERE id=111 AND active = true;
|
|
|
|
|
//// UPDATE users SET name='embroker 2', age=100, updated_at = '2013-11-17 21:34:10' WHERE id=111 AND active = true;
|
|
|
|
|
|
|
|
|
|
// Update an attribute if it is changed
|
|
|
|
|
db.Model(&user).Update("name", "hello")
|
|
|
|
@ -442,7 +442,7 @@ db.Delete(&email)
|
|
|
|
|
### Batch Delete
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
db.Where("email LIKE ?", "%jinzhu%").Delete(Email{})
|
|
|
|
|
db.Where("email LIKE ?", "%embroker%").Delete(Email{})
|
|
|
|
|
//// DELETE from emails where email LIKE "%jinhu%";
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
@ -593,7 +593,7 @@ db.FirstOrInit(&user, User{Name: "non_existing"})
|
|
|
|
|
// Found
|
|
|
|
|
db.Where(User{Name: "Jinzhu"}).FirstOrInit(&user)
|
|
|
|
|
//// user -> User{Id: 111, Name: "Jinzhu", Age: 20}
|
|
|
|
|
db.FirstOrInit(&user, map[string]interface{}{"name": "jinzhu"})
|
|
|
|
|
db.FirstOrInit(&user, map[string]interface{}{"name": "embroker"})
|
|
|
|
|
//// user -> User{Id: 111, Name: "Jinzhu", Age: 20}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
@ -613,7 +613,7 @@ db.Where(User{Name: "noexisting_user"}).Attrs("age", 20).FirstOrInit(&user)
|
|
|
|
|
|
|
|
|
|
// Found
|
|
|
|
|
db.Where(User{Name: "Jinzhu"}).Attrs(User{Age: 30}).FirstOrInit(&user)
|
|
|
|
|
//// SELECT * FROM USERS WHERE name = jinzhu';
|
|
|
|
|
//// SELECT * FROM USERS WHERE name = embroker';
|
|
|
|
|
//// user -> User{Id: 111, Name: "Jinzhu", Age: 20}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
@ -628,7 +628,7 @@ db.Where(User{Name: "non_existing"}).Assign(User{Age: 20}).FirstOrInit(&user)
|
|
|
|
|
|
|
|
|
|
// Found
|
|
|
|
|
db.Where(User{Name: "Jinzhu"}).Assign(User{Age: 30}).FirstOrInit(&user)
|
|
|
|
|
//// SELECT * FROM USERS WHERE name = jinzhu';
|
|
|
|
|
//// SELECT * FROM USERS WHERE name = embroker';
|
|
|
|
|
//// user -> User{Id: 111, Name: "Jinzhu", Age: 30}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
@ -659,9 +659,9 @@ db.Where(User{Name: "non_existing"}).Attrs(User{Age: 20}).FirstOrCreate(&user)
|
|
|
|
|
//// user -> User{Id: 112, Name: "non_existing", Age: 20}
|
|
|
|
|
|
|
|
|
|
// Found
|
|
|
|
|
db.Where(User{Name: "jinzhu"}).Attrs(User{Age: 30}).FirstOrCreate(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name = 'jinzhu';
|
|
|
|
|
//// user -> User{Id: 111, Name: "jinzhu", Age: 20}
|
|
|
|
|
db.Where(User{Name: "embroker"}).Attrs(User{Age: 30}).FirstOrCreate(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name = 'embroker';
|
|
|
|
|
//// user -> User{Id: 111, Name: "embroker", Age: 20}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Assign
|
|
|
|
@ -676,10 +676,10 @@ db.Where(User{Name: "non_existing"}).Assign(User{Age: 20}).FirstOrCreate(&user)
|
|
|
|
|
//// user -> User{Id: 112, Name: "non_existing", Age: 20}
|
|
|
|
|
|
|
|
|
|
// Found
|
|
|
|
|
db.Where(User{Name: "jinzhu"}).Assign(User{Age: 30}).FirstOrCreate(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name = 'jinzhu';
|
|
|
|
|
db.Where(User{Name: "embroker"}).Assign(User{Age: 30}).FirstOrCreate(&user)
|
|
|
|
|
//// SELECT * FROM users WHERE name = 'embroker';
|
|
|
|
|
//// UPDATE users SET age=30 WHERE id = 111;
|
|
|
|
|
//// user -> User{Id: 111, Name: "jinzhu", Age: 30}
|
|
|
|
|
//// user -> User{Id: 111, Name: "embroker", Age: 30}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Select
|
|
|
|
@ -738,12 +738,12 @@ db.Offset(10).Find(&users1).Offset(-1).Find(&users2)
|
|
|
|
|
## Count
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
db.Where("name = ?", "jinzhu").Or("name = ?", "jinzhu 2").Find(&users).Count(&count)
|
|
|
|
|
//// SELECT * from USERS WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (users)
|
|
|
|
|
//// SELECT count(*) FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (count)
|
|
|
|
|
db.Where("name = ?", "embroker").Or("name = ?", "embroker 2").Find(&users).Count(&count)
|
|
|
|
|
//// SELECT * from USERS WHERE name = 'embroker' OR name = 'embroker 2'; (users)
|
|
|
|
|
//// SELECT count(*) FROM users WHERE name = 'embroker' OR name = 'embroker 2'; (count)
|
|
|
|
|
|
|
|
|
|
db.Model(User{}).Where("name = ?", "jinzhu").Count(&count)
|
|
|
|
|
//// SELECT count(*) FROM users WHERE name = 'jinzhu'; (count)
|
|
|
|
|
db.Model(User{}).Where("name = ?", "embroker").Count(&count)
|
|
|
|
|
//// SELECT count(*) FROM users WHERE name = 'embroker'; (count)
|
|
|
|
|
|
|
|
|
|
db.Table("deleted_users").Count(&count)
|
|
|
|
|
//// SELECT count(*) FROM deleted_users;
|
|
|
|
@ -778,10 +778,10 @@ db.Exec("UPDATE orders SET shipped_at=? WHERE id IN (?)", time.Now, []int64{11,2
|
|
|
|
|
It is even possible to get query result as `*sql.Row` or `*sql.Rows`
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
row := db.Table("users").Where("name = ?", "jinzhu").Select("name, age").Row() // (*sql.Row)
|
|
|
|
|
row := db.Table("users").Where("name = ?", "embroker").Select("name, age").Row() // (*sql.Row)
|
|
|
|
|
row.Scan(&name, &age)
|
|
|
|
|
|
|
|
|
|
rows, err := db.Model(User{}).Where("name = ?", "jinzhu").Select("name, age, email").Rows() // (*sql.Rows, error)
|
|
|
|
|
rows, err := db.Model(User{}).Where("name = ?", "embroker").Select("name, age, email").Rows() // (*sql.Rows, error)
|
|
|
|
|
defer rows.Close()
|
|
|
|
|
for rows.Next() {
|
|
|
|
|
...
|
|
|
|
@ -790,7 +790,7 @@ for rows.Next() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Raw SQL
|
|
|
|
|
rows, err := db.Raw("select name, age, email from users where name = ?", "jinzhu").Rows() // (*sql.Rows, error)
|
|
|
|
|
rows, err := db.Raw("select name, age, email from users where name = ?", "embroker").Rows() // (*sql.Rows, error)
|
|
|
|
|
defer rows.Close()
|
|
|
|
|
for rows.Next() {
|
|
|
|
|
...
|
|
|
|
@ -850,7 +850,7 @@ db.Table("users").Select("users.name, emails.email").Joins("left join emails on
|
|
|
|
|
db.Joins("inner join emails on emails.user_id = users.id").Where("emails.email = ?", "x@example.org").Find(&user)
|
|
|
|
|
|
|
|
|
|
// find all email addresses for a user
|
|
|
|
|
db.Joins("left join users on users.id = emails.user_id").Where("users.name = ?", "jinzhu").Find(&emails)
|
|
|
|
|
db.Joins("left join users on users.id = emails.user_id").Where("users.name = ?", "embroker").Find(&emails)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Transactions
|
|
|
|
@ -986,8 +986,8 @@ var deleted_users []User
|
|
|
|
|
db.Table("deleted_users").Find(&deleted_users)
|
|
|
|
|
//// SELECT * FROM deleted_users;
|
|
|
|
|
|
|
|
|
|
db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()
|
|
|
|
|
//// DELETE FROM deleted_users WHERE name = 'jinzhu';
|
|
|
|
|
db.Table("deleted_users").Where("name = ?", "embroker").Delete()
|
|
|
|
|
//// DELETE FROM deleted_users WHERE name = 'embroker';
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Specifying The Table Name For A Struct Permanently with TableName
|
|
|
|
@ -1012,12 +1012,12 @@ func (u User) TableName() string {
|
|
|
|
|
## Error Handling
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
query := db.Where("name = ?", "jinzhu").First(&user)
|
|
|
|
|
query := db.Where("name = ?", "embroker").First(&user)
|
|
|
|
|
query := db.First(&user).Limit(10).Find(&users)
|
|
|
|
|
// query.Error will return the last happened error
|
|
|
|
|
|
|
|
|
|
// So you could do error handing in your application like this:
|
|
|
|
|
if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil {
|
|
|
|
|
if err := db.Where("name = ?", "embroker").First(&user).Error; err != nil {
|
|
|
|
|
// error handling...
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1044,15 +1044,15 @@ db.LogMode(true)
|
|
|
|
|
db.LogMode(false)
|
|
|
|
|
|
|
|
|
|
// Debug a single operation
|
|
|
|
|
db.Debug().Where("name = ?", "jinzhu").First(&User{})
|
|
|
|
|
db.Debug().Where("name = ?", "embroker").First(&User{})
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
### Customize Logger
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
// Refer gorm's default logger for how to: https://github.com/jinzhu/gorm/blob/master/logger.go#files
|
|
|
|
|
// Refer gorm's default logger for how to: https://github.com/embroker/gorm/blob/master/logger.go#files
|
|
|
|
|
db.SetLogger(gorm.Logger{revel.TRACE})
|
|
|
|
|
db.SetLogger(log.New(os.Stdout, "\r\n", 0))
|
|
|
|
|
```
|
|
|
|
@ -1182,14 +1182,11 @@ db.Where("email = ?", "x@example.org").Attrs(User{RegisteredIp: "111.111.111.111
|
|
|
|
|
|
|
|
|
|
# Author
|
|
|
|
|
|
|
|
|
|
**jinzhu**
|
|
|
|
|
**embroker**
|
|
|
|
|
|
|
|
|
|
* <http://github.com/jinzhu>
|
|
|
|
|
* <wosmvp@gmail.com>
|
|
|
|
|
* <http://twitter.com/zhangjinzhu>
|
|
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
|
|
|
|
Released under the [MIT License](https://github.com/jinzhu/gorm/blob/master/License).
|
|
|
|
|
Released under the [MIT License](https://github.com/embroker/gorm/blob/master/License).
|
|
|
|
|
|
|
|
|
|
[](http://godoc.org/github.com/jinzhu/gorm)
|
|
|
|
|
[](http://godoc.org/github.com/embroker/gorm)
|
|
|
|
|