Golang学习笔记之GORM基础使用(一)
本文章主要学习了GORM的基础知识,数据库的连接以及数据库表的建立的多种方法。本文为学习笔记,通过GORM官方中文文档和李文周的博客学习整理而成。
gorm是一个使用Go语言编写的ORM框架。它文档齐全,对开发者友好,支持主流数据库。 Object-Relationl Mapping,即对象关系映射,这里的Relationl指的是关系型数据库。它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。(本文主要以MySql数据库为例,其他数据库可以在官方文档上面找到对应示例)
下面开始正式记录学习过程
目录
特性
- 全功能 ORM
- 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
- Create,Save,Update,Delete,Find 中钩子方法
- 支持
Preload
、Joins
的预加载 - 事务,嵌套事务,Save Point,Rollback To Saved Point
- Context、预编译模式、DryRun 模式
- 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
- SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
- 复合主键,索引,约束
- Auto Migration
- 自定义 Logger
- 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
- 每个特性都经过了测试的重重考验
- 开发者友好
GORM基本示例
文章往下需要连接mysql数据库。
若没有mysql数据库则可以使用Docker快速创建MySQL实例。
Docker快速创建MySQL实例
前提要有docker环境
在本地的13306
端口运行一个名为mysql8019
,root用户名密码为root1234
的MySQL容器环境:
docker run --name mysql8019 -p 13306:3306 -e MYSQL_ROOT_PASSWORD=root1234 -d mysql:8.0.19
在另外启动一个MySQL Client
连接上面的MySQL环境,密码为上一步指定的密码root1234
:
docker run -it --network host --rm mysql mysql -h127.0.0.1 -P13306 --default-character-set=utf8mb4 -uroot -p
创建数据库
可以使用navicat或SQLyog直接创建,也可以使用命令行创建(具体指令见下)
CREATE DATABASE dbname;
安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
连接数据库
其他数据库可见下面连接,具体参考官方连接连接到数据库 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.https://gorm.io/zh_CN/docs/connecting_to_the_database.html
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{})
}
创建一个数据表(UserInfo),可以提前创建好,也可以使用自动迁移自动创建,则需要着重在意第三点。在vscode中创建一个对应的结构体。以下三点要着重注意:
1、结构体名称首字母必须要大写,并与数据库表名称对应
2、结构体中字段名称首字母必须要大写,并与数据库表中字段一一对应。
3、名为‘ID’的字段会默认作为表的主键,若是其他名则需要在后面加上`gorm:"primary_key"`
// UserInfo 用户信息
type UserInfo struct { //结构体名称首字母必须要大写,并与数据库表名称对应
ID uint //结构体中字段名称首字母必须要大写,并与数据库表中字段一一对应。
Name string
Gender string
Hobby string
}
//表示配置操作数据库的表名称,如果没有表名则是直接使用结构体的复数
func (UserInfo) TableName() string {
return "userinfo"
}
1、若数据表没有提前创建,在写完结构体后,要在增加以下代码:
db.AutoMigrate(&UserInfo{})
自动创建的表名为结构体名称的复数。 若想要禁用掉默认表名复数形式:
db.SingularTable(ture)
2、使用UserInfo结构体创建student表
db.Table("student").CreateTable(&UserInfo{})