@
目录写在前面
题目
解题 难度
更详细的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)
更新记录
// 更新单个属性(如果更改)
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 导航
编程规范
算法|面试
项目
标签:users,db,gorm,golang,go,Find,name From: https://www.cnblogs.com/nones/p/18203490