增加Taber实现校验
This commit is contained in:
@@ -24,6 +24,7 @@ import (
|
|||||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/utils/token"
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/utils/token"
|
||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"gorm.io/gorm/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Infrastructure 聚合了所有基础设施层的组件。
|
// Infrastructure 聚合了所有基础设施层的组件。
|
||||||
@@ -421,6 +422,8 @@ func initNotifyService(
|
|||||||
|
|
||||||
// initStorage 封装了数据库的初始化、连接和迁移逻辑。
|
// initStorage 封装了数据库的初始化、连接和迁移逻辑。
|
||||||
func initStorage(ctx context.Context, cfg config.DatabaseConfig) (database.Storage, error) {
|
func initStorage(ctx context.Context, cfg config.DatabaseConfig) (database.Storage, error) {
|
||||||
|
logger := logs.GetLogger(ctx)
|
||||||
|
|
||||||
// 创建存储实例
|
// 创建存储实例
|
||||||
storage := database.NewStorage(logs.AddCompName(context.Background(), "Storage"), cfg)
|
storage := database.NewStorage(logs.AddCompName(context.Background(), "Storage"), cfg)
|
||||||
if err := storage.Connect(ctx); err != nil {
|
if err := storage.Connect(ctx); err != nil {
|
||||||
@@ -428,8 +431,20 @@ func initStorage(ctx context.Context, cfg config.DatabaseConfig) (database.Stora
|
|||||||
return nil, fmt.Errorf("数据库连接失败: %w", err)
|
return nil, fmt.Errorf("数据库连接失败: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取所有模型
|
||||||
|
allModels := models.GetAllModels()
|
||||||
|
|
||||||
|
// -- 启动时检查:确保所有模型都实现了 schema.Tabler 接口 --
|
||||||
|
// 这是一个硬性要求,用于保证代码质量和表名定义的明确性。
|
||||||
|
// 如果一个模型没有实现 TableName() string 方法,程序将在此处 panic。
|
||||||
|
for _, model := range allModels {
|
||||||
|
if _, ok := model.(schema.Tabler); !ok {
|
||||||
|
logger.Panicf(fmt.Sprintf("启动失败:模型 %T 未实现 schema.Tabler 接口。请为该模型添加 TableName() string 方法,以显式指定其数据库表名。", model))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 执行数据库迁移
|
// 执行数据库迁移
|
||||||
if err := storage.Migrate(ctx, models.GetAllModels()...); err != nil {
|
if err := storage.Migrate(ctx, allModels...); err != nil {
|
||||||
return nil, fmt.Errorf("数据库迁移失败: %w", err)
|
return nil, fmt.Errorf("数据库迁移失败: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -263,17 +263,25 @@ func (ps *PostgresStorage) creatingIndex(ctx context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ps *PostgresStorage) creatingUniqueIndex(ctx context.Context) error {
|
// uniqueIndexDefinition 结构体定义了唯一索引的详细信息
|
||||||
storageCtx, logger := logs.Trace(ctx, ps.ctx, "creatingUniqueIndex")
|
type uniqueIndexDefinition struct {
|
||||||
|
|
||||||
// uniqueIndexDefinition 结构体定义了唯一索引的详细信息
|
|
||||||
type uniqueIndexDefinition struct {
|
|
||||||
tableName string // 索引所属的表名
|
tableName string // 索引所属的表名
|
||||||
columns []string // 构成唯一索引的列名
|
columns []string // 构成唯一索引的列名
|
||||||
indexName string // 唯一索引的名称
|
indexName string // 唯一索引的名称
|
||||||
whereClause string // 可选的 WHERE 子句,用于创建部分索引
|
whereClause string // 可选的 WHERE 子句,用于创建部分索引
|
||||||
description string // 索引的描述,用于日志记录
|
description string // 索引的描述,用于日志记录
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ginIndexDefinition 结构体定义了 GIN 索引的详细信息
|
||||||
|
type ginIndexDefinition struct {
|
||||||
|
tableName string // 索引所属的表名
|
||||||
|
columnName string // 需要创建 GIN 索引的列名
|
||||||
|
indexName string // GIN 索引的名称
|
||||||
|
description string // 索引的描述,用于日志记录
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ps *PostgresStorage) creatingUniqueIndex(ctx context.Context) error {
|
||||||
|
storageCtx, logger := logs.Trace(ctx, ps.ctx, "creatingUniqueIndex")
|
||||||
|
|
||||||
// 定义所有需要创建的唯一索引
|
// 定义所有需要创建的唯一索引
|
||||||
uniqueIndexesToCreate := []uniqueIndexDefinition{
|
uniqueIndexesToCreate := []uniqueIndexDefinition{
|
||||||
@@ -392,14 +400,6 @@ func (ps *PostgresStorage) creatingUniqueIndex(ctx context.Context) error {
|
|||||||
func (ps *PostgresStorage) createGinIndexes(ctx context.Context) error {
|
func (ps *PostgresStorage) createGinIndexes(ctx context.Context) error {
|
||||||
storageCtx, logger := logs.Trace(ctx, ps.ctx, "createGinIndexes")
|
storageCtx, logger := logs.Trace(ctx, ps.ctx, "createGinIndexes")
|
||||||
|
|
||||||
// ginIndexDefinition 结构体定义了 GIN 索引的详细信息
|
|
||||||
type ginIndexDefinition struct {
|
|
||||||
tableName string // 索引所属的表名
|
|
||||||
columnName string // 需要创建 GIN 索引的列名
|
|
||||||
indexName string // GIN 索引的名称
|
|
||||||
description string // 索引的描述,用于日志记录
|
|
||||||
}
|
|
||||||
|
|
||||||
// 定义所有需要创建的 GIN 索引
|
// 定义所有需要创建的 GIN 索引
|
||||||
ginIndexesToCreate := []ginIndexDefinition{
|
ginIndexesToCreate := []ginIndexDefinition{
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user