ZBLOG

golang GORM

Golang GORM 使用指南

GORM 是 Go 语言中最流行的 ORM(Object-Relational Mapping)框架之一,支持 MySQL、PostgreSQL、SQLite 等多种数据库。以下是 GORM 的详细使用指南。

1. 安装与初始化

安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql   # MySQL驱动

基本连接配置

package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	// MySQL DSN格式: [username[:password]@][protocol[(address)]]/dbname[?param1=value1&...]
	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 database")
	}
	
	// 获取通用数据库对象 sql.DB,然后使用其方法
	sqlDB, _ := db.DB()
	defer sqlDB.Close()
}

2. 模型定义

GORM 使用结构体作为模型基础:

type User struct {
	gorm.Model        // 内嵌包含ID, CreatedAt, UpdatedAt, DeletedAt字段
	Name      string `gorm:"size:255"`
	Age       int    `gorm:"default:18"`
	Email     string `gorm:"uniqueIndex;not null"`
}

type Product struct {
	Code   string `gorm:"primaryKey"`
	Price  uint
}

常用标签:

  • primaryKey:主键字段
  • column:指定列名
  • size:定义大小/长度
  • not null:非空约束
  • uniqueIndex:唯一索引
  • default:默认值

3. CRUD操作

Create (创建)

// 创建单条记录
user := User{Name: "Jinzhu", Age: 18, Email: "jinzhu@example.com"}
result := db.Create(&user) // pass pointer of data to Create

// user.ID             // returns inserted data's primary key value(s)
// result.Error        // returns error if any occurred during creation 
// result.RowsAffected // returns count of records affected 

//批量插入 
users := []User{
    {Name: "Alice", Email: "alice@example.com"},
    {Name: "Bob", Email: "bob@example.com"},
} 
db.Create(&users)

Query (查询)

//获取第一条记录(主键升序)  
var user User  
db.First(&user)  
// SELECT * FROM users ORDER BY id LIMIT  1 ;  

//获取一条记录(无排序)  
db.Take(&user)  

//获取最后一条记录(主键降序)  
db.Last(&user)  

//条件查询  
db.Where("name = ?","jinzhu").First(&user )  

//IN条件查询  
db.Where("name IN ?",[]string{"jinzhu","alice"}).Find(&users )  

//链式调用示例  
tx:= db.Where("age > ?",20 ).Where("email LIKE ?","%@example.com") .Order("created_at desc").Limit(10 ).Find(&users )

Update (更新)

//更新单个列(如果model有UpdatedAt字段会自动更新)   
db.Model(&User{}).Where("id =?",1 ).Update("name","hello")   

//更新多个列   
db.Model(&user ).Updates(User{Name:"hello",Age :18 })   

//只更新选定的字段   
db.Model(&user ).Select("Name").Updates(map[string]interface{}{"Name":"hello","Age":20 })   

Delete (删除)

//软删除(如果模型有DeletedAt字段)   
db.Delete(&User{},10 )   

////硬删除(永久删除)   
db.Unscoped().Delete(&User{},10 )

4 .高级特性

###关联关系

####一对多关系

type Blog struct {     
	gorm .Model     
	Name      string     
    Posts     []Post   //一对多关系    
}    

type Post struct {     
	gorm .Model     
    Title     string     
    Content   string     
    BlogID    uint      //外键    
}    

////自动迁移时会自动创建外键约束    
func initTables(db *grom.DB){      
	err:= db.AutoMigrate (&Blog{},&Post{})      
	if err!=nil { panic(err)}      
}    

////关联操作示例    
func createBlogWithPosts(db *grom.DB){      
blog:= Blog{         
	Name :"GORM Tutorials ",         
Posts :[]Post{{Title:"First Post"},},}      

	result:= db.Create (&blog )      
	fmt.Println(result.Error )      
	fmt.Println(blog.Posts[0].BlogID)//自动设置外键值      
}

####预加载(Eager Loading)

var blog Blog       
////预加载关联的Posts       
if err:= db.Preload ("Posts").First (&blog ,1 ).Error ;err!=nil {       
panic(err ) }       

fmt.Println(len(blog.Posts ))       
for _,post:= range blog.Posts {       
fmt.Println(post.Title ) }       

////带条件的预加载        
if err:= db.Preload ("Posts ","title LIKE ?","%first%" ).First (&blog ,1 ).Error ;err!=nil {        
panic(err ) }

##5 .事务处理

GORM提供了两种事务处理方式:

###手动事务

tx:= db.Begin ()  

if err:= tx.Create (&User{Name :"TxUser"}).Error ;err!=nil {  
tx.Rollback () return }  

if err:= tx.Model (&User{}).Where ("id =?",100 ).Update ("age ",30 ).Error ;err!=nil {  
tx.Rollback () return }  

tx.Commit ()

###自动事务

通过Transaction方法自动提交或回滚:

if err:= db.Transaction(func(tx *grom.DB)error{    
	if err:= tx.Create (&Product{Code:"D42",Price :100 }).Error ;err!=nil {    
	return err }    

	if err:= tx.Create (&Product{Code:"D43",Price :200 }).Error ;err!=nil {    
	return err }    

	return nil }) ;err!=nil {//返回任何错误都会回滚事务    
log.Fatal(err)}

如果需要更详细的教程,可以参考零声教育的相关课程内容。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23887

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?