Gorm连接数据库,并实现增删改查操作
此篇仅展示增删操作
1. 准备工作
首先进入终端下载我们需要的包(确保go和mysql安装完成,并设置了环境变量)
go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm
2. 连接数据库
这里以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 -> 用户名
pass -> 密码
127.0.0.1 -> mysql默认本地地址,也就是localhost
3306 -> mysql默认端口
dbname -> 数据库名称
charset -> 字符集编码
parseTime -> 把数据库datetime和date类型转换为golang的time.Time类型
loc -> 使用系统本地时区
gorm.config{} 中可以进行一些高级配置,详情请看官方文档。
3. 创建table
我们可以通过 db.AutoMigrate 和 db.Migrator().CreateTable() 方法来创建table。
*AutoMigrate* 方法:
使用 db.AutoMigrate 方法是一种自动创建和迁移数据库表的方式。它会根据你的 GORM 模型定义,自动检查数据库表是否存在,如果不存在则创建表,如果表结构有变化则进行迁移。这种方式适用于开发过程中的快速迭代和维护数据库结构的情况。
示例:
// 自动创建和迁移表
err := db.AutoMigrate(&Student{})
// 这里的db就是上述gorm.open的db哈
if err != nil {
panic("创建/迁移表格失败, error = " + err.Error())
}
Migrator().CreateTable 方法:
使用 db.Migrator().CreateTable 方法是一种手动创建数据库表的方式。你需要显式地指定要创建的表,它不会检查是否已经存在,而是直接创建表。这种方式适用于在特定情况下需要手动控制表创建过程的情况。
示例:
go复制代码// 手动创建表
err := db.Migrator().CreateTable(&Student{})
if err != nil {
panic("创建表格失败, error = " + err.Error())
}
区别总结:
AutoMigrate方法自动根据模型定义创建和迁移表,适用于自动化和快速迭代。Migrator().CreateTable方法手动创建表,适用于需要手动控制创建过程的情况。
在实际应用中,你可以根据项目需求选择合适的方法。通常情况下,开发和调试阶段可能更适合使用 AutoMigrate 方法,而特定场景下的手动控制可能需要使用 Migrator().CreateTable 方法。
4. 增
以下列结构体为例:
type Student struct {
ID int
Name string
Age int
ExternalCharacter string `gorm:"column:externalCharacter; size:255"`
}
func (s *Student) TableName() string {
return "student"
}
db.Create(结构体对象)
lisi := Student{2, "lisi", 18, "modest"}
result := db.Create(&lisi)
if result.Error != nil {
panic("插入字段失败, error = " + result.Error.Error())
}
fmt.Println(result.RowsAffected) // 返回影响的行数 1
等于INSERT INTOstudent(name,age,externalCharacter,id) VALUES ('lisi',18,'modest',2)
当然也可以同时增添多个字段
例如:
students := []Student{
{ID: 3, Name: "wangwu", Age: 20, ExternalCharacter: "generous"},
{ID: 4, Name: "xuliu", Age: 21, ExternalCharacter: "liberal"},
}
result := db.Create(&students)
if result.Error != nil {
panic("增加字段失败")
}
fmt.Println(result.RowsAffected) // 返回影响的行数 2
等于INSERT INTOstudent(name,age,externalCharacter,id) VALUES ('wangwu',20,'generous',3),('xuliu',21,'liberal',4)
db.Select(指定字段).Create(结构体对象)
lisi := Student{2, "lisi", 18, "modest"}
result := db.Select("ID", "Name", "Age").Create(&lisi)
if result.Error != nil {
panic("插入字段失败, error = " + result.Error.Error())
}
fmt.Println(result.RowsAffected) // 返回影响的行数 1
等于INSERT INTOstudent(name,age,id) VALUES ('lisi',18,2)
db.Omit(忽略字段).Create(结构体对象)
lisi := Student{2, "lisi", 18, "modest"}
result := db.Omit("ExternalCharacter").Create(&lisi)
if result.Error != nil {
panic("插入字段失败, error = " + result.Error.Error())
}
fmt.Println(result.RowsAffected) // 返回影响的行数 1
也等于INSERT INTOstudent(name,age,id) VALUES ('lisi',18,2)
原生sql语句
lisi := Student{2, "lisi", 18, "modest"}
result := db.Exec("INSERT INTO `student` (`name`,`age`,`externalCharacter`,`id`) VALUES ('lisi',18,'modest',2)")
if result.Error != nil {
panic("插入字段失败, error = " + result.Error.Error())
}
fmt.Println(result.RowsAffected) // 返回影响的行数 1
5. 删
删就很简单了,我们可以先查出来再删,也可以根据主键删除
可以先找到他
s := Student{}
err = db.Where("externalCharacter = 'frantic'").Find(&s).Error
if err != nil {
panic("查询失败, error = " + err.Error())
}
err = db.Delete(s).Error
if err != nil {
panic("删除失败, error = " + err.Error())
}
如果知道主键的话也可以直接
err = db.Delete(&Student{}, 5).Error
if err != nil {
panic("删除失败, error = " + err.Error())
}
```# Gorm连接数据库,并实现增删改查操作
此篇仅展示增删操作
#### 1. 准备工作
首先进入终端下载我们需要的包(确保*go*和*mysql*安装完成,并设置了环境变量)
```go
go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm
2. 连接数据库
这里以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 -> 用户名
pass -> 密码
127.0.0.1 -> mysql默认本地地址,也就是localhost
3306 -> mysql默认端口
dbname -> 数据库名称
charset -> 字符集编码
parseTime -> 把数据库datetime和date类型转换为golang的time.Time类型
loc -> 使用系统本地时区
gorm.config{} 中可以进行一些高级配置,详情请看官方文档。
3. 创建table
我们可以通过 db.AutoMigrate 和 db.Migrator().CreateTable() 方法来创建table。
*AutoMigrate* 方法:
使用 db.AutoMigrate 方法是一种自动创建和迁移数据库表的方式。它会根据你的 GORM 模型定义,自动检查数据库表是否存在,如果不存在则创建表,如果表结构有变化则进行迁移。这种方式适用于开发过程中的快速迭代和维护数据库结构的情况。
示例:
// 自动创建和迁移表
err := db.AutoMigrate(&Student{})
// 这里的db就是上述gorm.open的db哈
if err != nil {
panic("创建/迁移表格失败, error = " + err.Error())
}
Migrator().CreateTable 方法:
使用 db.Migrator().CreateTable 方法是一种手动创建数据库表的方式。你需要显式地指定要创建的表,它不会检查是否已经存在,而是直接创建表。这种方式适用于在特定情况下需要手动控制表创建过程的情况。
示例:
// 手动创建表
err := db.Migrator().CreateTable(&Student{})
if err != nil {
panic("创建表格失败, error = " + err.Error())
}
区别总结:
AutoMigrate方法自动根据模型定义创建和迁移表,适用于自动化和快速迭代。Migrator().CreateTable方法手动创建表,适用于需要手动控制创建过程的情况。
在实际应用中,你可以根据项目需求选择合适的方法。通常情况下,开发和调试阶段可能更适合使用 AutoMigrate 方法,而特定场景下的手动控制可能需要使用 Migrator().CreateTable 方法。
4. 增
以下列结构体为例:
type Student struct {
ID int
Name string
Age int
ExternalCharacter string `gorm:"column:externalCharacter; size:255"`
}
func (s *Student) TableName() string {
return "student"
}
db.Create(结构体对象)
lisi := Student{2, "lisi", 18, "modest"}
result := db.Create(&lisi)
if result.Error != nil {
panic("插入字段失败, error = " + result.Error.Error())
}
fmt.Println(result.RowsAffected) // 返回影响的行数 1
等于INSERT INTOstudent(name,age,externalCharacter,id) VALUES ('lisi',18,'modest',2)
当然也可以同时增添多个字段
例如:
students := []Student{
{ID: 3, Name: "wangwu", Age: 20, ExternalCharacter: "generous"},
{ID: 4, Name: "xuliu", Age: 21, ExternalCharacter: "liberal"},
}
result := db.Create(&students)
if result.Error != nil {
panic("增加字段失败")
}
fmt.Println(result.RowsAffected) // 返回影响的行数 2
等于INSERT INTOstudent(name,age,externalCharacter,id) VALUES ('wangwu',20,'generous',3),('xuliu',21,'liberal',4)
db.Select(指定字段).Create(结构体对象)
lisi := Student{2, "lisi", 18, "modest"}
result := db.Select("ID", "Name", "Age").Create(&lisi)
if result.Error != nil {
panic("插入字段失败, error = " + result.Error.Error())
}
fmt.Println(result.RowsAffected) // 返回影响的行数 1
等于INSERT INTOstudent(name,age,id) VALUES ('lisi',18,2)
db.Omit(忽略字段).Create(结构体对象)
lisi := Student{2, "lisi", 18, "modest"}
result := db.Omit("ExternalCharacter").Create(&lisi)
if result.Error != nil {
panic("插入字段失败, error = " + result.Error.Error())
}
fmt.Println(result.RowsAffected) // 返回影响的行数 1
也等于INSERT INTOstudent(name,age,id) VALUES ('lisi',18,2)
原生sql语句
lisi := Student{2, "lisi", 18, "modest"}
result := db.Exec("INSERT INTO `student` (`name`,`age`,`externalCharacter`,`id`) VALUES ('lisi',18,'modest',2)")
if result.Error != nil {
panic("插入字段失败, error = " + result.Error.Error())
}
fmt.Println(result.RowsAffected) // 返回影响的行数 1
5. 删
删就很简单了,我们可以先查出来再删,也可以根据主键删除
可以先找到他
s := Student{}
err = db.Where("externalCharacter = 'frantic'").Find(&s).Error
if err != nil {
panic("查询失败, error = " + err.Error())
}
err = db.Delete(s).Error
if err != nil {
panic("删除失败, error = " + err.Error())
}
如果知道主键的话也可以直接
err = db.Delete(&Student{}, 5).Error
if err != nil {
panic("删除失败, error = " + err.Error())
}
小总结
GORM 的作用:
- 简化数据库操作: GORM 提供了一种更直观和简单的方式来执行数据库操作,使开发人员可以使用面向对象的语法,而不需要编写大量的 SQL 查询语句。
- 提高开发效率: 使用 GORM 可以减少手动编写 SQL 查询和处理数据库连接的工作量,从而提高开发效率。
- 避免 SQL 注入: GORM 会自动将参数化查询应用到 SQL 查询中,从而减少 SQL 注入的风险。
- 数据库无关性: GORM 支持多种数据库,包括 MySQL、PostgreSQL、SQLite 等,使得应用程序在不同数据库之间切换更加容易。
- 模型定义: GORM 允许你通过结构体定义数据模型,从而将数据库表映射到 Go 的结构体上。