Golang中Gin数据库表名前缀的三种方法

 更新时间:2025年02月17日 10:04:41   作者:gskyi  
本文主要介绍了Golang中Gin数据库表名前缀的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在使用 GORM 时,如果你的数据库表名有前缀(例如:prefix_tcm_operation_logs),你可以通过自定义 TableName 方法来处理表前缀。TableName 方法是 GORM 用来获取数据库表名的地方,你可以在其中动态地添加前缀。

1. 方法一:通过 TableName 自定义表名

如果你希望所有表都有相同的前缀,可以在每个模型中手动实现 TableName 方法,动态拼接前缀。

1.1 实现 TableName 方法

假设数据库表前缀为 prefix_,你可以在模型中定义 TableName 方法来返回带有前缀的表名。

package models

import (
	"fmt"
	"time"
	"github.com/jinzhu/gorm"
)

type TcmOperationLogs struct {
	ID          uint64    `gorm:"primaryKey;autoIncrement;column:id" json:"id"`
	Action      string    `gorm:"type:varchar(255);column:action" json:"action"`
	Type        string    `gorm:"type:varchar(255);default:'';column:type" json:"type"`
	UserID      string    `gorm:"type:varchar(255);column:user_id" json:"user_id"`
	DoctorID    string    `gorm:"type:varchar(255);column:doctor_id" json:"doctor_id"`
	AdminID     string    `gorm:"type:varchar(255);column:admin_id" json:"admin_id"`
	Description string    `gorm:"type:text;column:description" json:"description"`
	CreatedAt   time.Time `gorm:"type:datetime;column:created_at" json:"created_at"`
	UpdatedAt   time.Time `gorm:"type:datetime;column:updated_at" json:"updated_at"`
}

// TableName 方法返回带前缀的表名
func (TcmOperationLogs) TableName() string {
	// 假设前缀为 'prefix_'
	return "prefix_tcm_operation_logs"
}

这样,每次 GORM 使用 TcmOperationLogs 模型时,都会自动使用 prefix_tcm_operation_logs 作为表名。

2. 方法二:全局前缀配置

如果你希望 GORM 中所有的表都使用相同的前缀,可以通过全局配置来自动为所有模型添加前缀。

2.1 使用 GORM 的 NamingStrategy 配置

在 GORM v2 中,可以通过设置全局的 NamingStrategy 来为所有表名添加前缀。NamingStrategy 允许你定制 GORM 的表名生成规则。

package main

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

// 定义模型
type TcmOperationLogs struct {
	ID          uint64    `gorm:"primaryKey;autoIncrement;column:id" json:"id"`
	Action      string    `gorm:"type:varchar(255);column:action" json:"action"`
	Type        string    `gorm:"type:varchar(255);default:'';column:type" json:"type"`
	UserID      string    `gorm:"type:varchar(255);column:user_id" json:"user_id"`
	DoctorID    string    `gorm:"type:varchar(255);column:doctor_id" json:"doctor_id"`
	AdminID     string    `gorm:"type:varchar(255);column:admin_id" json:"admin_id"`
	Description string    `gorm:"type:text;column:description" json:"description"`
	CreatedAt   time.Time `gorm:"type:datetime;column:created_at" json:"created_at"`
	UpdatedAt   time.Time `gorm:"type:datetime;column:updated_at" json:"updated_at"`
}

func main() {
	// 连接到 MySQL 数据库
	dsn := "root:password@tcp(127.0.0.1:3306)/your_db?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			TablePrefix: "prefix_", // 为所有表添加前缀
		},
	})
	if err != nil {
		log.Fatalf("failed to connect to database: %v", err)
	}

	// 自动迁移
	err = db.AutoMigrate(&TcmOperationLogs{})
	if err != nil {
		log.Fatalf("failed to migrate database: %v", err)
	}

	// 之后所有模型的表名都会自动带上前缀
	fmt.Println("Database connected and migrations completed")
}

3. 方法三:使用自定义 DB 和 Model 函数

另一种方法是通过自定义数据库操作函数来动态添加前缀。这种方法不常见,但在一些特殊场景下可能会用到。

package main

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

// 定义模型
type TcmOperationLogs struct {
	ID          uint64    `gorm:"primaryKey;autoIncrement;column:id" json:"id"`
	Action      string    `gorm:"type:varchar(255);column:action" json:"action"`
	Type        string    `gorm:"type:varchar(255);default:'';column:type" json:"type"`
	UserID      string    `gorm:"type:varchar(255);column:user_id" json:"user_id"`
	DoctorID    string    `gorm:"type:varchar(255);column:doctor_id" json:"doctor_id"`
	AdminID     string    `gorm:"type:varchar(255);column:admin_id" json:"admin_id"`
	Description string    `gorm:"type:text;column:description" json:"description"`
	CreatedAt   time.Time `gorm:"type:datetime;column:created_at" json:"created_at"`
	UpdatedAt   time.Time `gorm:"type:datetime;column:updated_at" json:"updated_at"`
}

func main() {
	// 连接到 MySQL 数据库
	dsn := "root:password@tcp(127.0.0.1:3306)/your_db?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("failed to connect to database: %v", err)
	}

	// 自定义查询
	var logs []TcmOperationLogs
	db.Table("prefix_tcm_operation_logs").Find(&logs)
	fmt.Println(logs)
}

4. 总结

  • 方法一:在每个模型中手动实现 TableName 方法来动态添加前缀。这适合每个表有不同前缀的场景。
  • 方法二:使用 GORM v2 的 NamingStrategy 配置,在全局范围内为所有表名添加前缀。这适合数据库中的所有表都使用相同的前缀。
  • 方法三:使用 db.Table("prefix_tcm_operation_logs") 来手动指定前缀。这种方式需要在查询时每次都指定表名。

通常,如果所有表都需要相同的前缀,使用 方法二 配合 NamingStrategy 会更加简洁和统一。

到此这篇关于Golang中Gin数据库表名前缀的实现的文章就介绍到这了,更多相关Golang Gin表名前缀内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • golang实现java uuid的序列化方法

    golang实现java uuid的序列化方法

    这篇文章主要介绍了golang实现java uuid的序列化方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Golang channel底层实现过程解析(深度好文)

    Golang channel底层实现过程解析(深度好文)

    Go语言为了方便使用者,提供了简单、安全的协程数据同步和通信机制,这篇文章主要介绍了Golang channel底层是如何实现的,需要的朋友可以参考下
    2024-07-07
  • Go语言实现Kafka消息队列的示例代码

    Go语言实现Kafka消息队列的示例代码

    本文主要介绍了Go语言实现Kafka消息队列的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • Go语言之结构体与方法

    Go语言之结构体与方法

    这篇文章主要介绍了Go语言之结构体与方法,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。下面我们就一起来学习什么是Go语言之结构体
    2021-10-10
  • Golang程序如何查找内存泄漏(pprof)

    Golang程序如何查找内存泄漏(pprof)

    该文章详细介绍了如何使用Golang的pprof工具查找内存泄漏,首先,在main包中引入pprof包并设置条件编译,然后编译程序并运行,通过执行gotoolpprof-inuse_space命令,可以进入交互模式并使用top命令查看内存分配最多的函数,如果本机中有源代码
    2024-12-12
  • 一文带你了解Go语言中锁的实现

    一文带你了解Go语言中锁的实现

    这篇文章主要带大家一起学习一下go锁和读写锁的总结文档, 主要从"参考"部分的文章结合源码学习,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • GoLang编程必备:GoFrame GoLand插件介绍

    GoLang编程必备:GoFrame GoLand插件介绍

    掌握GoLang编程必备工具,我们来深入了解GoFrame GoLand插件,这个小巧但强大的插件将极大提升你的开发效率,让代码流畅如行云流水,一起跟随本指南,解锁更智能的编程之旅!
    2023-12-12
  • go语言goto语句跳转到指定的标签实现方法

    go语言goto语句跳转到指定的标签实现方法

    这篇文章主要介绍了go语言goto语句跳转到指定的标签实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 深入理解Go语言中的数组和切片

    深入理解Go语言中的数组和切片

    Go语言中的数组大概相当与C/C++中的数组,固定大小,不能够动态扩展大小,而切片大概相当与C++中的Vector,可以动态扩展大小,当大小超过容量时,重新分配一块内存,然后将数据复制到新的内存区域。下面我们通过几个问题来更好理解golang 的数组和切片,一起来看看吧。
    2016-09-09
  • GO文件创建及读写操作示例详解

    GO文件创建及读写操作示例详解

    这篇文章主要为大家介绍了GO文件创建及读写操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04

最新评论