【go】【gorm】

@


写在前面

  • 相关博文
  • 个人博客首页
  • 免责声明:仅供学习交流使用!开源框架可能存在的风险和相关后果将完全由用户自行承担,本人不承担任何法律责任。

更详细的GORM速查表,涵盖了常见的操作和函数。

模型定义

type User struct {
    gorm.Model // 包含ID, CreatedAt, UpdatedAt, DeletedAt
    Name       string
    Age        int
    Birthday   *time.Time
    Emails     []Email        // 一对多关系
    BillingAddress  Address    // 一对一关系(属于)
    BillingAddressID sql.NullInt64
    ShippingAddress  Address   // 一对一关系
    CreditCard       CreditCard // 一对一关系
    Languages []Language `gorm:"many2many:user_languages;"` // 多对多关系
}

type Email struct {
    ID      int
    UserID  int    `gorm:"index"` // 外键(属于)
    Email   string `gorm:"type:varchar(100);unique_index"` // 字段级别的约束
    Subscribed bool
}

type Address struct {
    ID       int
    Address1 string         `gorm:"not null;unique"` // 设置字段为非空并唯一
    Address2 string         `gorm:"type:varchar(100);unique"`
    Post     sql.NullString `gorm:"not null"`
}

type Language struct {
    ID   int
    Name string `gorm:"index:idx_name_code"` // 创建名为`idx_name_code`的索引
    Code string `gorm:"index:idx_name_code"` // `Code`字段将是复合索引的一部分
}

type CreditCard struct {
    gorm.Model
    UserID  uint
    Number  string
}

连接数据库

// 连接SQLite数据库
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
    panic("failed to connect database")
}
// 自动迁移
db.AutoMigrate(&User{}, &Email{}, &Address{}, &Language{}, &CreditCard{})

创建记录

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}

// 创建记录
result := db.Create(&user) // 通过数据的指针来创建

err := result.Error // 处理错误
rowsAffected := result.RowsAffected // 返回插入记录的行数

查询记录

// 获取第一条记录(主键升序)
db.First(&user)
// 获取一条记录,没有指定排序
db.Take(&user)
// 获取最后一条记录(主键降序)
db.Last(&user)

// 获取所有记录
db.Find(&users)
// 条件查询
db.Where("name = ?", "jinzhu").Find(&users)
db.Where("name <> ?", "jinzhu").Find(&users)
db.Where("name IN (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)

// BETWEEN
db.Where("age BETWEEN ? AND ?", 20, 30).Find(&users)

gorm demo select

// Get first matched record
db.Where("name = ?", "jinzhu").First(&user)
// SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;

// Get all matched records
db.Where("name <> ?", "jinzhu").Find(&users)
// SELECT * FROM users WHERE name <> 'jinzhu';

// IN
db.Where("name IN ?", []string{"jinzhu", "jinzhu 2"}).Find(&users)
// SELECT * FROM users WHERE name IN ('jinzhu','jinzhu 2');

// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)
// SELECT * FROM users WHERE name LIKE '%jin%';

// AND
db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
// SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;

// Time
db.Where("updated_at > ?", lastWeek).Find(&users)
// SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';

// BETWEEN
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
// SELECT * FROM users WHERE created_at BETWEEN '2000-01-01 00:00:00' AND '2000-01-08 00:00:00';

struct and map select

// Struct
db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)
// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 ORDER BY id LIMIT 1;

// Map
db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users)
// SELECT * FROM users WHERE name = "jinzhu" AND age = 20;

// Slice of primary keys
db.Where([]int64{20, 21, 22}).Find(&users)
// SELECT * FROM users WHERE id IN (20, 21, 22);

更新记录

// 更新单个属性(如果更改)
db.Model(&user).Update("name", "jinzhu 2")

// 更新多个属性
db.Model(&user).Updates(User{Name: "jinzhu 2", Age: 20}) // 非零字段

// 更新多个属性,使用map
db.Model(&user).Updates(map[string]interface{}{"name": "jinzhu 2", "age": 20})

// 使用Save更新所有字段,即使它没有更改
db.Save(&user)

删除记录

// Delete - 删除 product
db.Delete(&product, 1)

更多查询方法



// 排序和分组
db.Order("name desc").Find(&users)
db.Order("name desc, age asc").Find(&users)
db.Group("name").Find(&users)

// Count
db.Model(&User{}).Where("name = ?", "jinzhu").Count(&count)

// Limit & Offset
db.Limit(10).Offset(5).Find(&users)

高级查询



// 使用相关模型进行查询
db.Preload("Orders").Find(&users)

// 使用Select指定要检索的字段
db.Select("name", "age").Find(&users)

// 使用Joins进行连接查询
db.Joins("JOIN emails ON emails.user_id = users.id").Find(&users)

// 执行原生SQL
db.Raw("SELECT name, age FROM users WHERE name = ?", "jinzhu").Scan(&result)

参考资料

基础/标准库/第三方库


golang 导航


编程规范


算法|面试


项目


posted @ 2024-05-21 10:48  Nones  阅读(3)  评论(0编辑  收藏  举报