使用 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助手提供,问题来源于学员提问