go语言ORM——gorm操作指南

字号+ 编辑: Snake 修订: Snake 来源: 2023-09-12 我要说两句(1)

gorm是一个使用Go语言编写的ORM框架。它文档齐全,对开发者友好,支持主流数据库。

什么是ORM?

图片1.png


ORM优缺点

优点:

提高开发效率

缺点:

牺牲执行性能

牺牲灵活性

弱化SQL能力

gorm介绍

GORM官网学习文档

进入github.com,搜索golang orm,点击jinzhu/gorm,然后点击https://gorm.io官网:

图片2.png


把页面语言改成简体中文,查看Docs(即文档),学习gorm

安装

go get -u github.com/jinzhu/grom

连接数据库

连接不同的数据库都需要导入对应数据的驱动程序,GORM已经包装了一些驱动程序,只需要按如下方式导入需要的数据库驱动即可:

import _ "github.com/jinzhu/gorm/dialects/mysql"
// import _ "github.com/jinzhu/gorm/dialects/postgres"
// import _ "github.com/jinzhu/gorm/dialects/sqlite"
// import _ "github.com/jinzhu/gorm/dialects/mssql"

连接MySQL

import (
"github.com/jinzhu/gorm"
_"github.com/jinzhu/gorm/dialects/mysql"
)
 
func main(){
db, err := gorm.Open("myqul","user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
defer db.Close()
}

连接PostgreSQL

基本上同上,注意引入对应postgres驱动并正确指定gorm.Open()参数。

import(
"github.com/jinzhu/gorm"
_"github.com/jinzhu/gorm/dialects/postgres"
)
 
func main(){
db, err := gorm.Open("postgres","host=myhost port=myport user=gorm dbname=gorm password=mypassword")
defer db.Close()
}

连接Sqlite3(是一个文件数据库)

基本代码同上,注意引入对应sqlite驱动并正确指定gorm.Open()参数。

import(
"github.com/jinzhu/gorm"
_"github.com/jinzhu/gorm/dialects/sqlite"
)
func mian(){
db, err := gorm.Open("sqlite3","/tmp/gorm.db") // 文件的路径
defer db.Close()
}

连接SQL Server

基本代码同上,注意引入对应mssql驱动并正确指定grom.Open()参数。

import(
"github.com/jinzhu/gorm"
_"github.com/jinzhu/grom/dialects/mssql"
)
 
func main(){
db, err := gorm.Open("mssql","sqlserver://username:password@localhost:1433?database=dbname")
defer db.Close()
}

GORM基本示例

注意:

1.本文以MySQL数据库为例,讲解GORM各项功能的主要使用方法。

2.往下阅读本文前,你需要有一个能够成功连接上的MySQL数据库实例。

Docker快速创建MySQL实例

如果不会安装MySQL或者懒得安装,可以使用命令快速运行一个MySQL8.0.19实例,当然前提死要有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

创建数据库

在使用GORM前手动创建数据库db1:

CREATE DATABASE db1;

GORM操作MySQL

使用GORM连接上面的db1进行创建、查询、更新、删除操作。

package main
 
import (
"fmt"
"github.com/jinzhu/gorm"
_"github.com/jinzhu/gorm/dialects/mysql"
)
 
// UserInfo用户信息
type UserInfo struct {
ID unit
Name string
Gender string
Hobby string
}
 
func main(){
// 连接MySQL数据库
db, err := gorm.Open("mysql","root:root1234@(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=true&loc=Local")
if err != nil {
panic(err)
}
defer db.Close()
 
// 创建表 自动迁移(把结构体和数据表进行对应)
db.AutoMigrate(&UserInfo{})
 
// 创建数据行  
u1 := UserInfo{1,"七米","男","篮球"}
u2 := UserInfo{2,"沙河娜扎","女","足球"}
 
// 创建记录
db.Create(&u1)
db.Create(&u2)
 
// 查询
var u = new(UserInfo)
db.First(u) // 查询表中第一条数据保存到u
fmt.Printf("%#v\n",u)
 
var uu UserInfo
db.Find(&&uu,"hobby=?","足球")
fmt.Printf("%#v\n",uu)
 
// 更新
db.Model(&u).Update("hobby","双色球")
 
// 删除
db.Delete(&u)
}

GORM Model定义

在使用ORM工具时,通常我们需要在代码中定义模型(Models)与数据库中的数据表进行映射,在GORM中模型(Models)通常是正常定义的结构体、基本的go类型或它们的指针。同时也支持sql.Scanner及driver.Valuer接口(interface)。

gorm.Model

为了方便模型定义,GORM内置了一个gorm.Model结构体。

Gorm.Model是一个包含了ID,CreateAt,UpdateAt,DeleteAt四个字段的Golang结构体。

// gorm.Model定义
type Model struct {
ID        unit `gorm:"primary_key"`
CreateAt  time.Time
UpdateAt  time.Time
DeleteAt   *time.Time
}

你可以将它嵌入到你自己的模型中:

// 将`ID`,`CreateAt`,`UpdateAt`,`DeleteAt`字段注入到`User`模型中
type User struct {
Gorm.Model
Name string
}

当然你也可以完全自己定义模型:

// 不使用gorm.Model,自行定义模型
type User struct {
ID int
Name string
}

模型定义示例

type user struct {
gorm.Model  // 内嵌gorm.Model
Name            string
Age              sql.NullInt64 // 零值类型
Birthday          *time.Time
Email             string  `gorm:"type:varchar(100);unique_index"`
Role              string  `gorm:"size:255"` // 设置字段大小为255
MemberNumber   *string  `gorm:"unique;nor null"` // 设置会员(member number)唯一且不为空
Num              int  `gorm:"AUTO_INCREMENT"` // 设置num为自增类型
Address           string  `gorm:"index:addr"` // 给address字段创建名为addr的索引
IgnoreMe          int  `gorm:"-"` // 忽略本字段
}


阅完此文,您的感想如何?
  • 有用

    1

  • 没用

    0

  • 开心

    0

  • 愤怒

    0

  • 可怜

    0

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.交流群: PHP+JS聊天群

相关课文
  • GO语言GORM如何更新字段

  • gorm如何创建记录与模型定义需要注意什么

  • gorm一般查询与高级查询

  • GORM时间戳跟踪及CURD(增删改查)

我要说说
网上宾友点评
1 楼 IP 61.149.221.224 的嘉宾 说道 : 1685840637
没什么难度的感觉