• gorm快速入门


    gorm快速入门

    gorm-doc

    1.快速入门

    package main
    
    import (
      "github.com/jinzhu/gorm"
      _ "github.com/jinzhu/gorm/dialects/sqlite"
    )
    
    type Product struct {
      gorm.Model
      Code string
      Price uint
    }
    
    func main() {
      db, err := gorm.Open("sqlite3", "test.db")
      if err != nil {
        panic("failed to connect database")
      }
      defer db.Close()
    
      // Migrate the schema
      db.AutoMigrate(&Product{})
    
      // 创建
      db.Create(&Product{Code: "L1212", Price: 1000})
    
      // 读取
      var product Product
      db.First(&product, 1) // 查询id为1的product
      db.First(&product, "code = ?", "L1212") // 查询code为l1212的product
    
      // 更新 - 更新product的price为2000
      db.Model(&product).Update("Price", 2000)
    
      // 删除 - 删除product
      db.Delete(&product)
    }
    

    2. 连接mysql

    import (
      "github.com/jinzhu/gorm"
      _ "github.com/jinzhu/gorm/dialects/mysql"
    )
    
    func main() {
      db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
    }
    
    // 方法二
    for {
    	db, err = gorm.Open("postgres", "host="+host+" port="+port+" user="+dbUser+" dbname="+dbName+" password="+password+" sslmode="+sslMode)
    	if err == nil {
    		break
    	}
    
    	log.Error(err)
    	time.Sleep(time.Duration(2) * time.Second)
    }
    
    	db.DB().SetMaxIdleConns(10)
    	db.DB().SetMaxOpenConns(20)
    
    	// db = db.Debug()
    

    3.表名默认就是结构体名称的复数,更改默认的表名

    gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  {
      return "prefix_" + defaultTableName;
    }
    

    4.指定表名,进行增删改查

    // 使用User结构体创建名为`deleted_users`的表
    db.Table("deleted_users").CreateTable(&User{})
    
    // 创建表时会追加 “ENGINE=InnoDB” 到 SQL 语句中。
    db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&User{})
    
    // SELECT * FROM deleted_users;
    var deleted_users []User
    db.Table("deleted_users").Find(&deleted_users)
    
    // DELETE FROM deleted_users WHERE name = 'jinzhu';
    db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()
    

    5.增删该查

    //增加一条记录
    var animal = Animal{Age: 99, Name: ""}
    db.Create(&animal)
    
    //创建之前,修改字段的值
    func (user *User) BeforeCreate(scope *gorm.Scope) error {
      scope.SetColumn("ID", uuid.New())
      return nil
    }
    

    6.预加载

    db.Set("gorm:auto_preload", true).Find(&users)
    db.Preload("Orders.OrderItems").Find(&users)
    
    //自定义预加载
    db.Preload("Orders", func(db *gorm.DB) *gorm.DB {
      return db.Order("orders.amount DESC")
    }).Find(&users)
    

    7.手动事务开启

    // 开启事务
    tx := db.Begin()
    
    // 在事务中做一些数据库操作 (这里应该使用 'tx' ,而不是 'db')
    tx.Create(...)
    
    // ...
    
    // 有错误时,手动调用事务的 Rollback()
    tx.Rollback()
    
    // 无错误时,手动调用事务的 Commit()
    tx.Commit()
    

    8.执行原生sql

    // 原生 SQL
    rows, err := db.Raw("select name, age, email from users where name = ?", "jinzhu").Rows() // (*sql.Rows, error)
    defer rows.Close()
    for rows.Next() {
      ...
      rows.Scan(&name, &age, &email)
      ...
    }
    
    //原生sql
    var result Result
    db.Raw("SELECT name, age FROM users WHERE name = ?", 3).Scan(&result)
    
    db.Exec("UPDATE orders SET shipped_at=? WHERE id IN (?)", time.Now(), []int64{11,22,33})
    

    9.开启db日志

    // 启用Logger,显示详细日志
    db.LogMode(true)
    
    // 禁用日志记录器,不显示任何日志
    db.LogMode(false)
    
    // 调试单个操作,显示此操作的详细日志
    db.Debug().Where("name = ?", "jinzhu").First(&User{})
    
    // 使用 os.Stdout 作为输出
    db.SetLogger(log.New(os.Stdout, "
    ", 0))
    

    相关链接

    https://jasperxu.github.io/gorm-zh/
    https://www.cnblogs.com/shijingjing07/p/10315411.html

  • 相关阅读:
    Java常见异常处理情况
    动手动脑总结
    动手动脑 总结
    二柱子测试三
    动手动脑总结
    动手动脑总结
    Docker同步IDEA
    UISlider
    Docker 部署 uwsgi+nginx + django
    UITableView 九宫格
  • 原文地址:https://www.cnblogs.com/tomtellyou/p/12597458.html
Copyright © 2020-2023  润新知