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() 方法或在配置中禁用复数表名来自定义表名。

本文作者:Gold_stein

本文链接:https://www.cnblogs.com/smartljy/p/18471269

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Gold_stein  阅读(197)  评论(0编辑  收藏  举报
历史上的今天:
2019-10-17 时间复杂度比较
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑
  1. 1 逃离地面 RAD & 三浦透子
逃离地面 - RAD & 三浦透子
00:00 / 00:00
An audio error has occurred.

作词 : 野田洋次郎

作曲 : 野田洋次郎

空飛ぶ羽根と引き換えに 繋ぎ合う手を選んだ僕ら

それでも空に魅せられて 夢を重ねるのは罪か

夏は秋の背中を見て その顔を思い浮かべる

憧れなのか、恋なのか 叶わぬと知っていながら

重力が眠りにつく 1000年に一度の今日

太陽の死角に立ち 僕らこの星を出よう

彼が眼を覚ました時 連れ戻せない場所へ

「せーの」で大地を蹴って ここではない星へ

行こう

もう少しで運命の向こう もう少しで文明の向こう

もう少しで運命の向こう もう少しで

夢に僕らで帆を張って 来たるべき日のために夜を超え

いざ期待だけ満タンで あとはどうにかなるさと 肩を組んだ

怖くないわけない でも止まんない

ピンチの先回りしたって 僕らじゃしょうがない

僕らの恋が言う 声が言う

「行け」と言う