小工具      在线工具  汉语词典  css  js  c++  java

GORM操作mysql数据库

# xorm,数据库,mysql,golang,gorm 额外说明

收录于:152天前

在这里插入图片描述

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

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 := "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框架会自动转化为下划线的格式,如下

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标签来指定创建数据库表时的相关参数。

标签 描述
柱子 指定列名称
类型 指定列数据类型
size 指定列大小 默认值 255
首要的关键 指定列为主键
独特的 将列指定为唯一
默认 指定列默认值
精确 指定列精度
非空 指定列为非 NULL
自动递增 指定该列是否为自增类型
默认 默认值

格式是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指南

. . .

相关推荐

额外说明

使用JS自动从服务器端下载文件到本地

1、文件下载页面用来显示要下载的文件数量和大小,以及总文件大小。数据展示这里就不贴了,就贴后面需要用到的三个弹出层吧:遮罩层、文件下载提示框、下载完成弹出框。 <!-- 遮罩层 --> <div id="zhegai" style="display:no

额外说明

Oracle查询当日数据(当年、当月、当日)

在oracle中,可利用trunc函数查询当天的数据,该函数可用于截取时间或者数值,将该函数与select语句配合使用即可查询当天的数据,语法为 --sysdate是获取系统当前时间函数 --TRUNC函数用于截取时间或者数值,返回指定的值 select

额外说明

A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[四](基于图传播的模型:node2vec、GCN、Graphsage、GeniePath等)算法汇总和应用场景归纳

知识图谱专栏简介:数据增强,智能标注,文本信息抽取(实体关系事件抽取)、知识融合算法方案、知识推理、模型优化、模型压缩技术等 专栏详细介绍:知识图谱专栏简介:数据增强,智能标注,文本信息抽取(实体关系事件抽取)、知识融合算法方案、知识推理、模型优化、模型

额外说明

Gradle 学习 ----Gradle 进阶说明

Gradle 进阶说明 3 、Gradle进阶说明 3. 1 、项目的生命周期 3. 2 、settings文件 3. 3 、Task 3. 3. 1 、任务入门 3. 3. 2 、任务的行为 3. 3. 3 、任务的依赖方式 3. 3. 4 、任务执行

额外说明

【GPT】如何拥有离线版本的GPT以及部署过程中的问题

【背景】 目前很多公司由于数据安全的问题,不能使用OpenAI的GPT,同时也没有必要非得使用如此泛用化的GPT。很多公司因此有训练自己的离线GPT的需求,这样的GPT只需要具备专业知识即可。 要使这个成为可能,首先就需要能够让GPT的Model在本地运

额外说明

无法打开ddraw.lib问题的解决 -- 将DirectX引入到VS工程中

1、VS2008中无法打开ddraw.lib问题 (1)在新的机器上用VS打开某工程,编译提示:无法打开ddraw.lb,导致链接失败。 (2)回想之前的开发内容,应该是接入第三方的DVR设备,在视频解码的时候用到了DX的东西,所以出现这个依赖问题。 (

额外说明

linux正则表达式之过滤空行和注释

linux过滤空行和注释 bash技术交流qq群:921383787 示例文本 cat > test.txt <<EOF line1 line2 line3 #line4 #line5 EOF 过滤掉文本以#注释开头的行和空行 egrep -v '^#

额外说明

Linux 下部署了Nginx服务器,始终外网无法访问

前不久遇到了一个问题,在CentOS上面搭建了一个Nginx服务器,并开启80端口监听,一开始外网输入服务器ip地址,死活不能访问,之后经过很大的调整,什么防火墙配置,Nginx的配置研究了一个遍都还是不能访问。不过内网通过curl http://ip是

额外说明

六、Kubernetes节点与 Pod 亲和性

Kubernetes节点与 Pod 亲和性 一、节点亲和性策略介绍 ​pod.spec.nodeAffinity preferredDuringSchedulingIgnoredDuringExecution:软策略 requiredDuringSche

额外说明

SpringAop使用详解

1. 常用注解 1.AOP核心概念 AOP (方面 Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。 2.AOP通知分类注解 @Aspect(方面类) 用在类上方表示这是一个

ads via 小工具