使用 GORM(Go 的 ORM 库)连接数据库,并实现增删改查操作,把实现过程整理成文章
GORM 简介
太高端的咱用不着,所以我就简单介绍一下gorm用得到的性质 对象操作:我们一般对数据库进行操作需要写详细的sql语句,并且对于一整个结构体的增删改查不够方便。在GORM里面,我们可以直接传入一整个结构体对象进行操作,编译器会帮我们自动绑定到表单和字段,使我们更加专注处理对象之间的逻辑,而不必太过思考对象内部的逻辑。
GORM 模型定义
模型定义:在go里面,如果我们定义的结构体比较的规范优美的话,可以使得其自动匹配上数据库里面的字段名。如何才叫做优美呢?UserName这个作为Go结构体的成员变量类型就比较优美,这种叫做驼峰,就是单词的开头用大写其他用小写。这样,我们会自动匹配上蛇形的字段名user_name,将单词用一个_分开,其余都是小写。而对于结构体的表名,User -> users这样来做对应。
小特性:
- 创建/更新时间跟踪:如果有
CreateAt和UpdateAt这样的成员变量的话,gorm会自动分别在创建和更新的时候将其字段更新为当前时间。 - 标签声明:在go结构体定义时,在变量后面可以加上标签tag用于gorm使用时的特殊解释。
常用的会有:
column:用于指定数据表的字段名-:用于忽略该字段primaryKey:用于将列定义为主键
正式连接到数据库(以mysql为例)
需要用驱动连接
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}
增删改查
-
创建记录:
- 插入单条记录
user := User{Name: "hia", Age: 21} result := db.Create(&user) - 插入记录但只给指定字段分配值
db.Select("Name", "Age").Create(&user)
- 插入单条记录
-
查询记录:
- 查询单个记录
返回第一条记录(主键升序)
db.First(&user)返回一条记录,没有指定排序字段db.Take(&user)返回最后一条记录db.Last(&user) - 查询所有记录
result := db.Find(&users)可以用以下的条件来查询特定内容:
// 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 - 查询单个记录
返回第一条记录(主键升序)
-
更新记录 关键是需要先选中记录,然后直接updates方法更新即可
result := db.Model(&user).Where("id = ?", 1).Updates(User{Name: "New Name", Age: 30}) -
删除记录 删除和更新很像,就是找到记录,然后做操作就可以了
- 删除指定记录
db.Delete(&user) - 删除满足条件的记录
db.where("name = ?", "hia").Delete(&user)
- 删除指定记录