VWED_server/migrations/versions/002_create_extended_properties_table.py

98 lines
4.6 KiB
Python
Raw Normal View History

2025-07-14 10:29:37 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
创建扩展属性表
Revision ID: 002
Revises: 001
Create Date: 2024-12-20 10:00:00.000000
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.mysql import VARCHAR, TEXT, DATETIME, ENUM
# revision identifiers, used by Alembic.
revision = '002'
down_revision = '001'
branch_labels = None
depends_on = None
def upgrade():
"""创建扩展属性表"""
# 创建扩展属性表
op.create_table(
'extended_properties',
sa.Column('id', sa.Integer, primary_key=True, autoincrement=True, comment='主键ID'),
sa.Column('created_at', DATETIME(fsp=6), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP(6)'), comment='创建时间'),
sa.Column('updated_at', DATETIME(fsp=6), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)'), comment='更新时间'),
sa.Column('is_deleted', sa.Boolean, nullable=False, default=False, comment='是否删除(软删除标记)'),
# 基本信息
sa.Column('property_key', VARCHAR(200), nullable=False, comment='属性键(与属性名称相同)'),
sa.Column('property_name', VARCHAR(200), nullable=False, comment='属性名称(唯一标识)'),
sa.Column('property_type', ENUM('string', 'integer', 'float', 'boolean', 'date', 'datetime', 'text', 'select', 'multiselect'), nullable=False, comment='属性类型'),
# 属性设置
sa.Column('is_required', sa.Boolean, nullable=False, default=False, comment='是否必填'),
sa.Column('is_enabled', sa.Boolean, nullable=False, default=True, comment='是否启用'),
# 描述信息
sa.Column('description', TEXT, comment='属性描述'),
sa.Column('placeholder', VARCHAR(500), comment='输入提示'),
# 默认值和选项
sa.Column('default_value', TEXT, comment='默认值'),
sa.Column('options', TEXT, comment='选项值JSON格式用于select和multiselect类型'),
# 验证规则
sa.Column('validation_rules', TEXT, comment='验证规则JSON格式'),
# 分类和排序
sa.Column('category', VARCHAR(100), comment='属性分类'),
sa.Column('sort_order', sa.Integer, nullable=False, default=0, comment='排序顺序'),
# 显示设置
sa.Column('display_width', sa.Integer, nullable=False, default=200, comment='显示宽度(像素)'),
sa.Column('display_format', VARCHAR(100), comment='显示格式'),
mysql_engine='InnoDB',
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci',
comment='扩展属性表'
)
# 创建索引
op.create_index('idx_extended_properties_property_key', 'extended_properties', ['property_key'])
op.create_index('idx_extended_properties_property_name', 'extended_properties', ['property_name'])
op.create_index('idx_extended_properties_property_type', 'extended_properties', ['property_type'])
op.create_index('idx_extended_properties_category', 'extended_properties', ['category'])
op.create_index('idx_extended_properties_is_enabled', 'extended_properties', ['is_enabled'])
op.create_index('idx_extended_properties_is_deleted', 'extended_properties', ['is_deleted'])
op.create_index('idx_extended_properties_sort_order', 'extended_properties', ['sort_order'])
# 创建唯一约束
op.create_unique_constraint('uq_extended_properties_property_key', 'extended_properties', ['property_key'])
op.create_unique_constraint('uq_extended_properties_property_name', 'extended_properties', ['property_name'])
def downgrade():
"""删除扩展属性表"""
# 删除索引
op.drop_index('idx_extended_properties_property_key', 'extended_properties')
op.drop_index('idx_extended_properties_property_name', 'extended_properties')
op.drop_index('idx_extended_properties_property_type', 'extended_properties')
op.drop_index('idx_extended_properties_category', 'extended_properties')
op.drop_index('idx_extended_properties_is_enabled', 'extended_properties')
op.drop_index('idx_extended_properties_is_deleted', 'extended_properties')
op.drop_index('idx_extended_properties_sort_order', 'extended_properties')
# 删除唯一约束
op.drop_constraint('uq_extended_properties_property_key', 'extended_properties', type_='unique')
op.drop_constraint('uq_extended_properties_property_name', 'extended_properties', type_='unique')
# 删除表
op.drop_table('extended_properties')