开发者

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

目录
  • 1. 方法一:通过 TableName 自定义表名
    • 1.1 实现 TableName 方法
  • 2. 方法二:全局前缀配置
    • 2.1 使用 GORM 的 NamingStrategy 配置
  • 3. 方法三:使用自定义 DB 和 Model 函数
    • 4. 总结

      在使用 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(25php5);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 的 NamingjavascriptStrategy 配置

      在 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
      
      impo编程客栈rt (
      	"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表名前缀内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜