官方文档
ORM简介
对象关系映射(Object Relation Mapping)模式是一种为了解决面向对象与关系数据库,如mysql,存在的互不匹配的现象的技术,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
使用一个类表示一张表,类中的属性表示表的字段,类的实例化对象表示一条记录
GORM是Go语言的一个ORM(Object Relational Mapping)库。它可以让我们通过Go来操作数据库中的数据。
GORM使用简介
- 在MySQL或其他数据库中先创建Schema。
- 使用GORM将Go结构体映射到数据库表,比如定义一个User结构体映射到user表。
- 在Go代码中,我们就可以操作那个结构体,而GORM会在后台自动转换为对应的SQL命令,来crud数据库表中的数据。
- 也可以直接在Go代码中用GORM的API构造SQL查询数据库。
GORM 数据库连接 (简单连接)
首先建立本文所需的数据库
mysql>create database gorm charset utf8mb4
通过一个现有的数据库连接来初始化 *gorm.DB
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
username := "root" //账号
password := "123456" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "gorm" //数据库名
timeout := "10s" //连接超时,10秒
// root:root@tcp(127.0.0.1:3306)/gorm?
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
db, err := gorm.Open(mysql.Open(dsn))
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
// 连接成功
fmt.Println(db)
}
dsn(data source name)就是数据库的连接配置信息,包含了连接数据库需要的所有参数。
最后如果运行成功,输出db
user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local
是一个完整的数据库连接字符串示例,包含了用户名、密码、数据库地址、数据库名称以及其他参数。
具体解释如下:
user:pass
:表示数据库连接所使用的用户名和密码。你需要将其替换为实际的用户名和密码,用于连接到数据库服务器。tcp(127.0.0.1:3306)
:指定数据库服务器的地址和端口号。这里的示例是连接到本地主机上运行的 MySQL 数据库服务器,默认端口号是 3306。/dbname
:指定要连接的数据库名称。你需要将其替换为你要连接的实际数据库的名称。?charset=utf8mb4&parseTime=True&loc=Local
:表示连接的其他参数,包括字符集、时间解析以及时区设置
user:pass
和dbname是需要更改成你自己的
[Running] go run "e:\backend\go\study\learn\gorm\learn\testgorm.go"
&{0xc000172510 <nil> 0 0xc0001a2000 1}
高级配置所需的连接可以查阅官方文档
命名策略
gorm倾向于约定,而不是配置
默认情况下,GORM 使用 ID
作为主键,使用结构体名的 蛇形复数
作为表名,字段名的 蛇形
作为列名,并使用 CreatedAt
、UpdatedAt
字段追踪创建、更新时间
- 蛇形(snake case),字母全部小写,单词之间用_分隔。如user_name
- 复数是在蛇形基础上,再转换为复数形式。如user_names
- 结构体名 UserInfo
- 表名会映射为 user_infos (蛇形复数)
- 字段 UserName
- 列名会映射为 user_name (蛇形形式)
- 字段 ID
- 列名会映射为 id (蛇形形式),并会作为主键
我们将与数据库连接的代码放入init,grom中结构体表示类,并通过类来对应表,这里我们定义一个student结构体,并通过automigrate来在mysql中创建对用表格
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var DB *gorm.DB
func init() {
username := "root" //账号
password := "123456" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "gorm" //数据库名
timeout := "10s" //连接超时,10秒
// root:root@tcp(127.0.0.1:3306)/gorm?
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
db, err := gorm.Open(mysql.Open(dsn))
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
DB = db
// 连接成功
fmt.Println(db)
}
type Student struct {
ID uint
Name string
Age int
}
func main() {
DB.AutoMigrate(&Student{})
}
得到
可以看到表名为复数students,而字段名不变。同时,id也约定作为主键
高级配置查阅本文前所附官方文档
日志相关
由于默认不打印相关操作,我们这里设置日志等级来显示
GORM 定义了这些日志级别:Silent
、Error
、Warn
、Info
我们在连接数据库部分增加配置
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
则打印相关sql语句,方便查看
更多配置查阅官方文档,GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.