GORM操作mysql数据库

GORM操作mysql数据库_第1张图片

对象就是程序的数据结构,关系是数据库。就是将程序的数据结构与数据库表对应起来。

在GORM是Go语言的ORM框架,将go的数据结构转化为数据库表,例如将结构体转化为数据库表。

引入gorm框架

  1. 远程下载gorm框架
go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm
  1. 项目中引入
import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)
  1. 引入datasource
datasource := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

在datasource中配置数据库用户和密码,以及数据库名,其他不用变。在使用数据库驱动连接数据时首先保证数据库存在,需要创建数据库CREATE DATABASE [name]

  1. 数据库驱动连接数据库
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操作mysql数据库_第2张图片
一般情况下不会使用代码创建数据库。另外使用驼峰命令时,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 指南

你可能感兴趣的:(#,ORM-对象关系映射,数据库,mysql,golang,gorm)