对象就是程序的数据结构,关系是数据库。就是将程序的数据结构与数据库表对应起来。
在GORM是Go语言的ORM框架,将go的数据结构转化为数据库表,例如将结构体转化为数据库表。
引入gorm框架
- 远程下载gorm框架
go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm
- 项目中引入
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
- 引入datasource
datasource := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
在datasource中配置数据库用户和密码,以及数据库名,其他不用变。在使用数据库驱动连接数据时首先保证数据库存在,需要创建数据库CREATE DATABASE [name]
- 数据库驱动连接数据库
drivername := "root:root@tcp(127.0.0.1:3306)/account?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(drivername), &gorm.Config{})
if err != nil {
fmt.Println("error connect mysql", err)
}
经过上述步骤返回一个数据库驱动,可以用数据驱动操作数据库。
完整步骤如下:
func connMysql() (*gorm.DB) {
drivername := "root:root@tcp(127.0.0.1:3306)/account?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(drivername), &gorm.Config{})
if err != nil {
fmt.Println("error connect mysql", err)
}
return db
}
CURD
得到数据驱动后,就可以利用驱动来操作数据库,最常见的就是表的创建与删除,数据的增删改查。
结构体映射数据表
使用gorm框架可以将Go的结构体对应在数据中生成对应的表。
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
db := connMysql()
//结构体创建数据库表(自动迁移)
db.AutoMigrate(&Account{})
}
func connMysql() *gorm.DB {
drivername := "root:root@tcp(127.0.0.1:3306)/account?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(drivername), &gorm.Config{})
if err != nil {
fmt.Println("error connect mysql", err)
}
return db
}
type Account struct {
Id int
User string
Password string
Role string
}
db.AutoMigrate(&Account{})
将以结构体字段为参照,在数据库中构建数据库表,参数为结构体实例地址。结构体有id字段时,会自动映射映射为结构体的主键,且自增不为空。创建的数据表会将首字母的大写改为小写,若是驼峰名,用下划线代替。
一般情况下不会使用代码创建数据库。另外使用驼峰命令时,gorm框架会自动转化为下划线的格式,如下
type StuTest struct {
StuId int
StuName string
StuAge int
StuSex string
}
mysql> show tables;
+-------------------+
| Tables_in_account |
+-------------------+
| accounts |
| stu_tests |
| user |
+-------------------+
mysql> describe stu_tests;
+----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| stu_id | bigint | YES | | NULL | |
| stu_name | longtext | YES | | NULL | |
| stu_age | bigint | YES | | NULL | |
| stu_sex | longtext | YES | | NULL | |
+----------+----------+------+-----+---------+-------+
在创建结构体时可以使用tag标签来指定创建数据库表时的相关参数。
tag | 描述 |
---|---|
column | 指定列名 |
type | 指定列数据类型 |
size 指定列大小 | 默认值255 |
PRIMARY_KEY | 将列指定为主键 |
UNIQUE | 将列指定为唯一 |
DEFAULT | 指定列默认值 |
PRECISION | 指定列精度 |
NOT NULL | 将列指定为非 NULL |
AUTO_INCREMENT | 指定列是否为自增类型 |
default | 默认值 |
格式是gorm:"column:id"
或gorm:"PRIMARY_KEY"
。
type StuTest struct {
StuId int `gorm:"PRIMARY_KEY"`
StuName string `gorm:"column:name"`
StuAge int
StuSex string
}
插入结构体数据
a1 := Account{0, "xiaoxu", "123456", "manager"}
db.Create(&a1)
db.Create(&a1)
方法插入数据,无需写sql语句,参数为结构体实例的地址。
查询数据
var a Account
db.First(&a)
fmt.Println(a)
db.First(&a)
方法是查询第一个数据,Find()
方法查询指定数据,第一个参数为赋值对象,第二个参数为主键。
var a1 Account
db.Find(&a1, 2)
//db.First(&a1)
fmt.Println(a1)
where
查询
// Get first matched record
db.Where("name = ?", "jinzhu").First(&user)
// SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;
// 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)
更新数据
var a Account
db.First(&a)
db.Model(&a).Update("role", "admin")
更新数据首先要查出数据,对某条的某一列数据更新。除了这样查出对应数据再更改外gorm也支持指定条件更新。
更新单个列
// Update with conditions
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;
更新部分字段
// Select with Struct (select zero value fields)
db.Model(&user).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0})
// UPDATE users SET name='new_name', age=0 WHERE id=111;
字段的查询用结构体的成员而不是数据的生成字段。
删除数据
var a Account
db.First(&a)
db.Delete(&a)
db.Delete(&User{}, 10)
// DELETE FROM users WHERE id = 10;
db.Delete(&User{}, "10")
// DELETE FROM users WHERE id = 10;
db.Delete(&users, []int{1,2,3})
// DELETE FROM users WHERE id IN (1,2,3);
更多请移步官网GORM 指南