使用GORM操作数据库

本文介绍了如何使用GORM在Go中操作数据库,包括依赖安装、定义实体类、开启连接、创建/更新表、插入/更新/删除记录、查询以及各种查询操作。详细讲解了GORM的Save、Create、Update、Delete方法,以及查询、关联和更新等功能。
摘要由CSDN通过智能技术生成

依赖安装

github.com/jinzhu/gorm

定义实体类

注意:

实体类结构体中,要映射到数据库的字段首字母必须大写,否则会被忽略

可以通过定义嵌套gorm.Model这个结构体的类型来定义实体类,gorm.Model中定义了数据库表的一些常用基本字段

type Model struct {
  ID   uint `gorm:"primary_key"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}

比如我们定义User实体

type User struct{
	gorm.Model
	Name string
}

开启连接

开启连接参数字符串格式如下

username:password@protocol(address)/dbname?param=value

其中如果protocol和address是默认值,可以直接省略,比如

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

创建表

创建表默认使用结构体类型名称的驼峰命名复数形式作为表名,比如User就是users
通过

db.SingularTable(true)

设定不使用复数形式,则User对应的表为user
CreateTable方法接收一个interface{}类型,创建对应结构体类型的表。如果创建的表已经存在,会抛出异常
比如

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	gorm.Model
	Name string
}

func main() {
	db, _ := gorm.Open("mysql", "root:root@/gorm?charset=utf8&parseTime=True&loc=Local")
	defer db.Close()
	db.CreateTable(&User{})	//创建表名users
}

更新表

AutoMigrate方法与CreateTable用法类似,不同的是,如果表已经存在,AutoMigrate也不会抛出异常,而是使用当前传入的最新结构体更新表结构,如果表不存在,则与CreateTable表现一样,所以刚刚的

db.CreateTable(&User{})	

也可以使用下面语句替代

db.AutoMigrate(&User{})	

插入/更新记录

gorm.Model的主键ID为整数类型,映射到数据库时为自动递增主键
Save方法接收一个结构体指针对象

  • 如果该对象的主键没有设定,或者是默认值0,则作为插入操作,由数据库策略生成主键(比如自增)插入记录
  • 如果该对象设定了主键,数据库中不存在该主键记录,则作为插入操作,使用该主键插入记录
  • 如果该对象设定了主键,数据库中存在该主键记录,则作为更新操作,更新数据库记录
	db, _ := gorm.Open("mysql", "root:root@/gorm?charset=utf8&parseTime=True&loc=Local")
	defer db.Close()
	db.AutoMigrate(&User{})
	user := User{Name: "aa"}
	db.Save(&user)
	//新增成功后,如果主键是由数据库生成,会将主键回显到实体对象的属性
	println(user.ID)
	user.Name = "bb"
	db.Save(&user)//更新

插入记录

Create方法用法与Save类似,不同的是Create方法只能用于插入,如果对象具备主键,并且数据库中已经存在该主键记录,则抛出异常

	db, _ := gorm.Open("mysql", "root:root@/gorm?charset=utf8&parseTime=True&loc=Local")
	defer db.Close()
	db.AutoMigrate(&User{})
	user := User{Name: "aa"}
	db.Create(&user)	//没有设定主键,默认由数据库自增
	println(user.ID)

NewRecord方法用于判断某个对象是否可以作为新纪录插入,如果该对象主键为空或者0,或者数据库表中不存在该主键记录,返回true,否则返回false,所以可以用于辅助Create方法

	...
	if(db.NewRecord(&user)){
		db.Create(&user)
	}

修改记录

Update和Updates方法提供对记录进行更新操作,可以通过Map或者struct传递更新属性,建议通过Map
因为通过struct更新时,FORM将仅更新具有非空值的字段

// 使用`map`更新多个属性,只会更新这些更改的字段
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})

// 使用组合条件批量更新单个属性
db.Model(&user).Where("name= ?", "aa").Update("name", "hel
GORM是一个Go语言的 ORM(Object-Relational Mapping,对象关系映射)工具包,它允许开发者通过面向对象的方式来操作MySQL、SQLite等关系型数据库。关于GORM数据库主从复制,实际上GORM本身并不直接支持主从复制的功能,这是数据库层面需要配置的事情。 但在GORM的应用场景中,如果你正在使用支持主从复制的数据库服务,比如MySQL的InnoDB Cluster或者有现成的主从解决方案,你可以按照以下步骤来设置: 1. **设置数据库连接**:在GORM配置中,你需要提供两个不同的数据库连接,一个是主库,另一个是从库,通常用于读取操作。 ```go db, err := gorm.Open("mysql", "user:password@tcp(master_host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local") slaveDB, err := gorm.Open("mysql", "user:password@tcp(slave_host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local") ``` 2. **事务管理**:为了保证数据一致性,主库的操作一般会包含在事务中,而从库读取可以单独处理,无需事务保护。 3. **读写分离策略**:在业务层面上,可以采用"读多写少"的原则,大部分查询操作通过从库完成,只在写入新数据或者更新时才切换到主库。 请注意,GORM并不会自动帮你处理高可用或主从切换的问题,这需要结合你的应用架构以及数据库中间件如ProxySQL、HAProxy等来实现。如果想了解如何在GORM基础上构建这样的系统,你可能需要查阅具体的数据库文档和相关的高可用架构指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值