GORM基本用法

GORM基本用法

详细内容

GORM 概述

GORM 是一个适用于 Golang 的功能齐全的 ORM(对象关系映射)库。它简化了数据库操作,将数据库中的表映射为 Golang 结构体,并通过代码实现常见的 SQL 操作,如查询、插入、更新和删除等。

GORM 的特点:

  • 全功能 ORM:支持 CRUD(增删查改)、事务、关联关系、钩子函数、预加载等。
  • 数据库支持:支持 MySQL、PostgreSQL、SQLite、SQL Server 等数据库。
  • 链式调用:提供链式调用方式编写 SQL 查询,代码简洁清晰。
  • 迁移功能:提供数据库自动迁移能力,可自动创建或更新表结构。

基本用法

1. 安装 GORM

首先需要安装 GORM 及对应的数据库驱动程序(以 MySQL 为例):

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

2. 初始化数据库连接

package main

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

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 {
		log.Fatal("数据库连接失败:", err)
	}

	log.Println("数据库连接成功!")
}

3. 定义模型(结构体)

GORM 使用结构体映射数据库中的表。示例定义一个 User 结构体:

type User struct {
	ID    uint   `gorm:"primaryKey"`
	Name  string `gorm:"size:100"`
	Email string `gorm:"unique"`
	Age   int
}

4. 自动迁移(Auto Migrate)

GORM 提供自动迁移功能,根据结构体生成数据库表。

db.AutoMigrate(&User{})

这里通过AutoMigrate生成的表,其表名是GORM根据我们的类名推导出来的,把类名User变成复数形式Users,就得到了表名。

5. 插入数据

使用 Create 方法插入一条数据:

user := User{Name: "Alice", Email: "alice@example.com", Age: 25}
result := db.Create(&user)

if result.Error != nil {
	log.Println("插入失败:", result.Error)
} else {
	log.Printf("成功插入用户,ID: %d", user.ID)
}

6. 查询数据

var user User
// 查询单条记录
db.First(&user, 1) // 根据主键查询
db.First(&user, "email = ?", "alice@example.com")

// 查询多条记录
var users []User
db.Where("age > ?", 20).Find(&users)

7. 更新数据

// 更新用户的 Email
db.Model(&user).Update("Email", "newalice@example.com")

// 批量更新
db.Model(&user).Updates(User{Name: "Alice Updated", Age: 26})

8. 删除数据

// 根据主键删除
db.Delete(&user, 1)

// 根据条件删除
db.Where("age > ?", 30).Delete(&User{})

9. 关联关系

GORM 支持常见的数据库关联关系(如一对一、一对多、和多对多)。

示例:UserOrder 的一对多关系:

type Order struct {
	ID     uint
	UserID uint
	Amount float64
}

type User struct {
	ID     uint
	Name   string
	Orders []Order `gorm:"foreignKey:UserID"`
}

db.AutoMigrate(&User{}, &Order{})

10. 使用事务

err := db.Transaction(func(tx *gorm.DB) error {
	if err := tx.Create(&User{Name: "Bob"}).Error; err != nil {
		return err
	}

	if err := tx.Create(&Order{UserID: 1, Amount: 100.0}).Error; err != nil {
		return err
	}

	return nil // 返回 nil 表示提交事务
})

if err != nil {
	log.Println("事务失败:", err)
} else {
	log.Println("事务成功")
}

总结

GORM 提供了简单易用的 API,帮助 Golang 开发者专注于业务逻辑而非数据库操作。通过定义结构体并使用链式调用,GORM 让 SQL 操作更直观,同时支持复杂的查询、关联关系和事务处理,适用于多种数据库和项目场景。

表名管理

是的,GORM 会自动推断模型结构体所对应的数据库表名。默认情况下,表名是根据结构体名称的复数形式确定的。


表名的推断规则

  1. 默认规则

    • GORM 会将模型结构体名称转换为小写的复数形式作为表名。例如:
      • Userusers
      • Productproducts
  2. 表名格式的转换

    • GORM 会根据英文的复数规则转换。例如:
      • Categorycategories
      • Companycompanies
    • 如果不符合复数规则(如外来词),可以手动设置表名。

自定义表名

如果你不希望使用 GORM 的自动复数规则,可以手动指定表名。有两种常见的方法:

  1. 在结构体上使用 TableName() 方法。
  2. 在 GORM 配置中禁用复数表名。

1. 使用 TableName() 方法

在模型结构体中添加 TableName() 方法,可以覆盖 GORM 自动推断的表名。

type User struct {
	ID    uint   `gorm:"primaryKey"`
	Name  string `gorm:"size:100"`
	Email string `gorm:"unique"`
	Age   int
}

// 自定义表名方法
func (User) TableName() string {
	return "custom_user_table"
}

这样,GORM 会将表名设为 "custom_user_table"


2. 禁用复数表名(全局配置)

你还可以在 GORM 初始化时禁用自动复数表名:

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
	NamingStrategy: schema.NamingStrategy{
		SingularTable: true, // 禁用复数表名
	},
})

此时,GORM 会直接使用结构体的名称作为表名,而不会自动加复数。例如:

  • Useruser

总结

默认情况下,GORM 会将 User 结构体映射到名为 users 的表中(复数形式)。如果不想使用默认的复数规则,你可以通过实现 TableName() 方法或在配置中禁用复数表名来自定义表名。

posted @ 2024-10-17 03:09  Gold_stein  阅读(41)  评论(0编辑  收藏  举报