一,什么是gorm
1,orm
Object-Relationl Mapping
ORM(对象关系映射)是一种编程技术,用于在关系型数据库和面向对象编程语言之间建立映射关系。ORM允许开发人员使用面向对象的方式操作数据库,而不需要直接编写SQL语句。它将数据库表格和记录映射为对象和类,使得开发人员可以使用面向对象的思维和技术来处理数据。
ORM的主要目标是简化数据库操作和提高开发效率。它提供了一组API或工具,用于执行常见数据库操作,例如查询、插入、更新和删除数据。通过ORM,开发人员可以使用编程语言本身的特性(如类、对象、继承、多态等)来表示数据库结构和操作,而不必关心底层数据库的细节。
ORM框架使得开发人员可以更加专注于业务逻辑和对象模型的设计,而无需直接与数据库操作和SQL语句打交道,从而简化了开发过程并提高了开发效率。
2,gorm
每一门语言都有对应的ORM框架
python:SQLAlchemy DjiangoORM
java:Hibernate Mybatis
golang:gorm
二,安装 gorm
## 必须安装gorm
go get -u gorm.io/gorm
## 安装相应的数据库驱动。GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
go get -u gorm.io/driver/mysql
三,gorm连接数据库
GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server。以MySQL为例
1,连接MySQL
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"os"
)
var DB *gorm.DB
func init() {
//root:账号(改为自己的)
//123456:数据库密码(改为自己的)
//tcp(127.0.0.1):数据库所在的主机和端口号(改为自己的)
//test:数据库名字(改为自己的)
//charset:设置连接的字符集为UTF-8。通过使用UTF-8字符集,可以支持更广泛的字符范围和多语言支持。
//parseTime:告诉MySQL驱动程序将数据库中的时间戳数据类型解析为Go时间类型。这样可以方便在Go代码中处理时间数据。
//loc:设置时区为本地时区。这可以确保在处理时间时根据本地时区进行适当的转换。
dataSourceName := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local"
//db, err := gorm.Open(mysql.Open(dataSourceName))
//跳过默认事务,为了确保数据一致性,GORM会在事务里执行写入操作,如果没有这方面要求,可以在初始化时禁用
db, err := gorm.Open(mysql.Open(dataSourceName), &gorm.Config{
SkipDefaultTransaction: true,
})
checkError(err) //检查错误
DB = db
fmt.Println("连接成功:", DB)
}
func main() {
}
func checkError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
2,自动迁移
在GORM中,AutoMigrate
用于自动创建或更新数据库表结构以匹配GORM模型的定义。
当您在GORM中定义了一个模型(Model),它对应于数据库中的一张表,AutoMigrate
方法可以自动执行数据库迁移操作,以确保数据库表结构与模型定义一致。
在GORM中使用AutoMigrate
方法:
import (
"gorm.io/gorm"
"gorm.io/driver/mysql"
)
type User struct {
gorm.Model
Name string
Email string
}
func main() {
dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("Failed to connect to database")
}
// 自动创建或更新数据库表
err = db.AutoMigrate(&User{})
if err != nil {
panic("Failed to migrate database")
}
// 进行其他数据库操作...
}
四,gorm相关操作CRUD
package main
import(
"fmt"
"gorm.io/gorm"
"gorm.io/driver/mysql"
"os"
)
type User struct{ //User users
Id int //id 主键
Name string `gorm:"column:names"`//指定特定的
Age int
City string//city
//如果表里有多个字段,只会查询到结构体定义的字段
}
func(User)TableName()string{
return "user"
}
func main() {
//与数据库连接的信息
dataSourceName:="root:123456@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True"
//建立连接
client,err:=gorm.Open(mysql.Open(dataSourceName),nil)//第二个参数是一些选项配置
checkError(err)//检查错误
//查Retrieve
//1多个
var users []User
client.Select("id,names").Where("city=?","北京").Find(&users)//使用问号更加安全,防止sql注入攻击
//client.where("city="+"北京")//也可以使用"+",不安全
if len(users)>0{
fmt.Println(users)
}else{
fmt.Println("无数据")
}
//2单个
var user User
client.Select("names").Where("city=?","上海").First(&user)//第一个
fmt.Println(user)
client.Select("names").Where("city=?","广州").Last(&user)//最后一个
fmt.Println(user)
client.Select("names,city").Where("city=?","北京").Limit(1).Take(&user)//随机取一个
fmt.Println(user)
//增Create
user2:=User{
Id:21,
Name:"alice",
Age:23,
City:"南京",
}
client.Create(user2)
//client.CreateInBatches()//可使用插入多条数据
//改Update
//client.Model(User{}).Update("city","西安")//表内所有"city"都将改为"西安"
//client.Model(User{}).Where("id=?",21).Update("city","西安")//Model指定表名,User的函数TableName
client.Model(User{}).Where("id=?",21).Updates(//修改一行数据
map[string]interface{}{"city":"成都","age":17},//末尾有逗号
)
//删Delete
client.Model(User{}).Where("id=?",1).Delete(User{})
//client.Where("id=?",1).Delete(User{})//等同以上
}
func checkError(err error){
if err!=nil{
fmt.Println(err)
os.Exit(1)
}
}