ZBLOG

gorm.io/driver/mysql 连接查询

使用 GORM 连接和查询 MySQL 数据库

GORM 是一个流行的 Go 语言 ORM 库,以下是使用 gorm.io/driver/mysql 进行 MySQL 数据库连接和查询的完整指南。

1. 安装依赖

首先需要安装 GORM 和 MySQL 驱动:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

2. 基本连接配置

package main

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

func main() {
	// MySQL DSN (Data Source Name)
	dsn := "username: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")
	}
	
	fmt.Println("Database connected successfully!")
}

3. CRUD 操作示例

a) 定义模型

type User struct {
	gorm.Model        // 内嵌 gorm.Model (包含 ID, CreatedAt, UpdatedAt, DeletedAt)
	Name       string `gorm:"size:255"`
	Email      string `gorm:"uniqueIndex;size:255"`
	Age        int
}

b) AutoMigrate (自动迁移)

// AutoMigrate会创建表、缺失的外键、约束、列和索引
err = db.AutoMigrate(&User{})
if err != nil {
    panic("failed to migrate database")
}

c) Create (插入数据)

newUser := User{Name: "Alice", Email: "alice@example.com", Age: 25}
result := db.Create(&newUser) // pass pointer of data to Create

fmt.Println(newUser.ID)       // returns inserted data's primary key
fmt.Println(result.Error)     // returns error
fmt.Println(result.RowsAffected) // returns inserted records count

d) Query (查询数据)

i. First/Last/Take/Find

// Get first record ordered by primary key
var user User
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;

// Get one record, no specified order
db.Take(&user)
// SELECT * FROM users LIMIT 1;

// Get last record, ordered by primary key desc
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;

// Find all records with conditions 
var users []User 
result := db.Where("age > ?",-20).Find(&users)
fmt.Printf("%d rows found\n", result.RowsAffected)

ii. Where条件查询

// String条件 
db.Where("name = ?", "Alice").First(&user)

// Struct条件(忽略零值字段)
db.Where(&User{Name: "Alice", Age:0}).First(&user)

// Map条件 
db.Where(map[string]interface{}{"name": "Alice"}).Find(&users)

// IN条件 
db.Where("name IN ?", []string{"Alice","Bob"}).Find(&users)

iii. Select指定字段

type APIUser struct {
    ID   uint   
    Name string 
}

var apiUsers []APIUser 

db.Model(&User{}).Select("id,name").Where("age > ?",18).Find(&apiUsers)

e) Update (更新数据)

// Save会保存所有字段,即使它是零值  
db.First(&user)  
user.Name = "New Alice"  
user.Age =30  
db.Save(&user)

// Update单个列  
db.Model(User{}).Where("id=?",1).Update("name","New Name")

// Updates多列(支持struct或map)  
db.Model(User{}).Where(id=?",1).
   Updates(User{Name:"New Name2",Age:31}) //只更新非零值字段  

db.Model(User{}).Where(id=?",1).
   Updates(map[string]interface{}{"name":"New Name3","age":32})

f) Delete (删除数据)

// Delete一条记录(软删除)  
db.Delete(user)//如果模型有DeletedAt字段则执行软删除  

//永久删除(unscoped表示绕过软删除逻辑)   
db.Unscoped().Delete(user,"id=?",10)

##4 .高级查询功能

a)预加载关联

假设用户有多篇文章:

type Article struct{
   grom Model   
   Title string   
   Content string   
   UserID uint    
}

func(u*User )Articles()[]Article{
   var articles[]Article   
   DB.Model(u ).Related(articles )
   return articles     
}

...

var userWithArticles User    
DB.Preload(Articles ).First (&userWithArticles ,1 )

b)事务处理

tx:=DB.Begin()
defer func(){
 if r:=recover();r!=nil{
 tx.Rollback()
 }
}( )

if err:=tx.Create (&Product {Code:D42 Price :100 }).Error ;err!=nil{
 tx.Rollback ()
 return      
 }

if err:=tx.Create (&Order {ProductID :product.ID }).Error ;err!=nil{
 tx.Rollback ()
 return      
 }

return tx.Commit ().Error    

c)原生SQL执行

”` rows,_:=DB.Raw (“SELECT name , age FROM users WHERE name=? “,“jinzhu”).Rows() defer rows.Close()

for rows.Next(){ var name string var age int
rows.Scan(name ,age ) … }


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?