高级用法

    事物 {#t}

    要在事务中执行一组操作,一般流程如下。

    1. // 开始事务
    2. tx := db.Begin()
    3. // 在事务中做一些数据库操作(从这一点使用'tx',而不是'db')
    4. tx.Create(...)
    5. // ...
    6. // 发生错误时回滚事务
    7. tx.Rollback()
    8. // 或提交事务
    9. tx.Commit()
    1. tx := db.Begin()
    2. // 注意,一旦你在一个事务中,使用tx作为数据库句柄
    3. if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
    4. tx.Rollback()
    5. return err
    6. }
    7. if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
    8. tx.Rollback()
    9. return err
    10. }
    11. tx.Commit()
    12. return nil
    13. }

    执行原生SQL

    1. row := db.Table("users").Where("name = ?", "jinzhu").Select("name, age").Row() // (*sql.Row)
    2. row.Scan(&name, &age)
    3. rows, err := db.Model(&User{}).Where("name = ?", "jinzhu").Select("name, age, email").Rows() // (*sql.Rows, error)
    4. defer rows.Close()
    5. for rows.Next() {
    6. ...
    7. rows.Scan(&name, &age, &email)
    8. ...
    9. // Raw SQL
    10. defer rows.Close()
    11. for rows.Next() {
    12. ...
    13. rows.Scan(&name, &age, &email)
    14. ...
    15. }

    迭代中使用sql.Rows的Scan

    1. rows, err := db.Model(&User{}).Where("name = ?", "jinzhu").Select("name, age, email").Rows() // (*sql.Rows, error)
    2. defer rows.Close()
    3. for rows.Next() {
    4. var user User
    5. db.ScanRows(rows, &user)
    6. // do something
    7. }

    通用数据库接口sql.DB {#g}

    *gorm.DB连接获取通用数据库接口*sql.DB

    1. db.DB().SetMaxIdleConns(10)
    2. db.DB().SetMaxOpenConns(100)
    1. type Product struct {
    2. ID string `gorm:"primary_key"`
    3. LanguageCode string `gorm:"primary_key"`
    4. }

    日志 {#l}

    Gorm有内置的日志记录器支持,默认情况下,它会打印发生的错误

    自定义日志

    1. db.SetLogger(gorm.Logger{revel.TRACE})