Golang中Gin數(shù)據(jù)庫表名前綴的三種方法
在使用 GORM 時,如果你的數(shù)據(jù)庫表名有前綴(例如:prefix_tcm_operation_logs),你可以通過自定義 TableName 方法來處理表前綴。TableName 方法是 GORM 用來獲取數(shù)據(jù)庫表名的地方,你可以在其中動態(tài)地添加前綴。
1. 方法一:通過 TableName 自定義表名
如果你希望所有表都有相同的前綴,可以在每個模型中手動實現(xiàn) TableName 方法,動態(tài)拼接前綴。
1.1 實現(xiàn) TableName 方法
假設(shè)數(shù)據(jù)庫表前綴為 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 {
// 假設(shè)前綴為 'prefix_'
return "prefix_tcm_operation_logs"
}
這樣,每次 GORM 使用 TcmOperationLogs 模型時,都會自動使用 prefix_tcm_operation_logs 作為表名。
2. 方法二:全局前綴配置
如果你希望 GORM 中所有的表都使用相同的前綴,可以通過全局配置來自動為所有模型添加前綴。
2.1 使用 GORM 的 NamingStrategy 配置
在 GORM v2 中,可以通過設(shè)置全局的 NamingStrategy 來為所有表名添加前綴。NamingStrategy 允許你定制 GORM 的表名生成規(guī)則。
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 數(shù)據(jù)庫
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 函數(shù)
另一種方法是通過自定義數(shù)據(jù)庫操作函數(shù)來動態(tài)添加前綴。這種方法不常見,但在一些特殊場景下可能會用到。
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 數(shù)據(jù)庫
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. 總結(jié)
- 方法一:在每個模型中手動實現(xiàn)
TableName方法來動態(tài)添加前綴。這適合每個表有不同前綴的場景。 - 方法二:使用 GORM v2 的
NamingStrategy配置,在全局范圍內(nèi)為所有表名添加前綴。這適合數(shù)據(jù)庫中的所有表都使用相同的前綴。 - 方法三:使用
db.Table("prefix_tcm_operation_logs")來手動指定前綴。這種方式需要在查詢時每次都指定表名。
通常,如果所有表都需要相同的前綴,使用 方法二 配合 NamingStrategy 會更加簡潔和統(tǒng)一。
到此這篇關(guān)于Golang中Gin數(shù)據(jù)庫表名前綴的實現(xiàn)的文章就介紹到這了,更多相關(guān)Golang Gin表名前綴內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang利用casbin實現(xiàn)權(quán)限驗證詳解
Casbin是一個強(qiáng)大的、高效的開源訪問控制框架,其權(quán)限管理機(jī)制支持多種訪問控制模型,Casbin只負(fù)責(zé)訪問控制。本文將利用casbin實現(xiàn)權(quán)限驗證功能,需要的可以參考一下2023-02-02
Linux系統(tǒng)下Go語言開發(fā)環(huán)境搭建
這篇文章主要介紹了Linux系統(tǒng)下Go開發(fā)環(huán)境搭建,需要的朋友可以參考下2022-04-04
Golang?Compare?And?Swap算法詳細(xì)介紹
CAS算法是一種有名的無鎖算法。無鎖編程,即不使用鎖的情況下實現(xiàn)多線程之間的變量同步,也就是在沒有線程被阻塞的情況下實現(xiàn)變量的同步,所以也叫非阻塞同步Non-blocking?Synchronization2022-10-10
golang實現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫
Go 語言是一門適合用于編寫高效且并發(fā)的 Web 應(yīng)用程序的編程語言,同時也可以使用它進(jìn)行數(shù)據(jù)處理和分析,本文主要介紹了如何通過go語言實現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫,感興趣的小伙伴可以了解下2025-04-04

