【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 导航
编程规范
算法|面试
项目
免责声明:
本站提供的资源,都来自网络,版权争议与本站无关,所有内容及软件的文章仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,我们不保证内容的长久可用性,通过使用本站内容随之而来的风险与本站无关,您必须在下载后的24个小时之内,从您的电脑/手机中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。侵删请致信