Files
dify-plus/admin/server/initialize/gorm.go
T

177 lines
4.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package initialize
import (
"fmt"
"log"
"os"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/model/example"
"github.com/flipped-aurora/gin-vue-admin/server/model/gaia"
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
"go.uber.org/zap"
"gorm.io/gorm"
)
func Gorm() *gorm.DB {
switch global.GVA_CONFIG.System.DbType {
case "mysql":
global.GVA_ACTIVE_DBNAME = &global.GVA_CONFIG.Mysql.Dbname
return GormMysql()
case "pgsql":
global.GVA_ACTIVE_DBNAME = &global.GVA_CONFIG.Pgsql.Dbname
return GormPgSql()
case "oracle":
global.GVA_ACTIVE_DBNAME = &global.GVA_CONFIG.Oracle.Dbname
return GormOracle()
case "mssql":
global.GVA_ACTIVE_DBNAME = &global.GVA_CONFIG.Mssql.Dbname
return GormMssql()
case "sqlite":
global.GVA_ACTIVE_DBNAME = &global.GVA_CONFIG.Sqlite.Dbname
return GormSqlite()
default:
global.GVA_ACTIVE_DBNAME = &global.GVA_CONFIG.Mysql.Dbname
return GormMysql()
}
}
func RegisterTables() {
db := global.GVA_DB
err := db.AutoMigrate(
system.SysApi{},
system.SysIgnoreApi{},
system.SysUser{},
system.SysBaseMenu{},
system.JwtBlacklist{},
system.SysAuthority{},
system.SysDictionary{},
system.SysOperationRecord{},
system.SysAutoCodeHistory{},
system.SysDictionaryDetail{},
system.SysBaseMenuParameter{},
system.SysBaseMenuBtn{},
system.SysAuthorityBtn{},
system.SysAutoCodePackage{},
system.SysExportTemplate{},
system.Condition{},
system.JoinTemplate{},
system.SysParams{},
example.ExaFile{},
example.ExaCustomer{},
example.ExaFileChunk{},
example.ExaFileUploadAndDownload{},
// Extend gaia model
gaia.AccountDingTalkExtend{},
gaia.AppRequestTestBatch{},
gaia.AppRequestTest{},
gaia.SystemIntegration{}, // Extend System Integration
gaia.ForwardingExtend{}, // Extend Forwarding Extend
gaia.BatchWorkflow{}, // Extend Batch Workflow
gaia.BatchWorkflowTask{}, // Extend Batch Workflow Task
gaia.AppVersionConfig{}, // 应用版本全局配置(Token
gaia.AppVersionRelease{}, // 应用版本发布
gaia.AppVersionDownload{}, // 应用版本各平台安装包
gaia.ModelProviderConfig{}, // 模型提供商配置
gaia.ModelProxyLog{}, // 模型中转请求日志
system.SysUserGlobalCode{}, // Extend Global Code
// Extend gaia model
)
if err != nil {
global.GVA_LOG.Error("register table failed", zap.Error(err))
os.Exit(0)
}
//// 如果是PostgreSQL数据库,创建必要的序列
//if global.GVA_CONFIG.System.DbType == "pgsql" {
// createPostgreSQLSequences(db)
//}
err = bizModel()
if err != nil {
global.GVA_LOG.Error("register biz_table failed", zap.Error(err))
os.Exit(0)
}
global.GVA_LOG.Info("register table success")
}
// createPostgreSQLSequences 为PostgreSQL数据库创建必要的序列
func createPostgreSQLSequences(db *gorm.DB) {
// 需要创建序列的表列表
tables := []string{
"sys_users",
"sys_apis",
"sys_base_menus",
"sys_authorities",
"sys_dictionaries",
"sys_operation_records",
"sys_auto_code_histories",
"sys_dictionary_details",
"sys_base_menu_parameters",
"sys_base_menu_btns",
"sys_authority_btns",
"sys_auto_code_packages",
"sys_export_templates",
"conditions",
"join_templates",
"sys_params",
"exa_files",
"exa_customers",
"exa_file_chunks",
"exa_file_upload_and_downloads",
"account_ding_talk_extends",
"app_request_test_batches",
"app_request_tests",
"system_integrations",
"forwarding_extends",
"batch_workflows",
"batch_workflow_tasks",
"app_version_config",
"app_version_releases",
"app_version_downloads",
"sys_user_global_codes",
}
for _, table := range tables {
sequenceName := fmt.Sprintf("%s_id_seq", table)
// 检查序列是否已存在
var exists bool
checkSQL := "SELECT EXISTS (SELECT 1 FROM pg_sequences WHERE sequencename = ?)"
if err := db.Raw(checkSQL, sequenceName).Scan(&exists).Error; err != nil {
log.Printf("检查序列 %s 是否存在时出错: %v", sequenceName, err)
continue
}
if !exists {
// 创建序列
createSQL := fmt.Sprintf("CREATE SEQUENCE IF NOT EXISTS %s START 1 INCREMENT 1", sequenceName)
if err := db.Exec(createSQL).Error; err != nil {
log.Printf("创建序列 %s 时出错: %v", sequenceName, err)
continue
}
// 将序列设置为表的默认值
alterSQL := fmt.Sprintf("ALTER TABLE %s ALTER COLUMN id SET DEFAULT nextval('%s')", table, sequenceName)
if err := db.Exec(alterSQL).Error; err != nil {
log.Printf("设置表 %s 的ID默认值时出错: %v", table, err)
continue
}
// 更新序列的当前值(如果表中已有数据)
updateSQL := fmt.Sprintf("SELECT setval('%s', COALESCE((SELECT MAX(id) FROM %s), 1), true)", sequenceName, table)
if err := db.Exec(updateSQL).Error; err != nil {
log.Printf("更新序列 %s 的当前值时出错: %v", sequenceName, err)
}
log.Printf("成功为表 %s 创建序列 %s", table, sequenceName)
}
}
}