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

原文地址:https://www.cnblogs.com/tomtellyou/p/12597458.html