baodan/api/insurance/db/migrate_001.py

131 lines
3.7 KiB
Python
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.

"""迁移脚本 001重命名旧字段为新字段
使用方式:
python -m insurance.db.migrate_001
或在应用启动时自动执行(需要配置 MIGRATION_ENABLED=true
"""
from sqlalchemy import text
from insurance.db.compat import db
def migrate():
"""执行迁移:重命名旧字段为新字段。"""
print("[migrate_001] 开始执行迁移...")
try:
# 检查字段是否已经迁移(防止重复执行)
result = db.session.execute(text("""
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'wecom_user_mapping'
AND column_name = 'internal_user_id'
"""))
if result.fetchone():
print("[migrate_001] 迁移已执行过,跳过")
return True
# 开始事务
db.session.begin()
# 1. 重命名 wecom_user_mapping 表的旧字段
print("[migrate_001] 重命名 wecom_user_mapping.dify_user_id -> internal_user_id")
# 添加新字段
db.session.execute(text("""
ALTER TABLE wecom_user_mapping
ADD COLUMN internal_user_id VARCHAR(64)
"""))
# 复制数据
db.session.execute(text("""
UPDATE wecom_user_mapping
SET internal_user_id = dify_user_id
"""))
# 设置 NOT NULL 约束
db.session.execute(text("""
ALTER TABLE wecom_user_mapping
ALTER COLUMN internal_user_id SET NOT NULL
"""))
# 创建新索引
db.session.execute(text("""
DROP INDEX IF EXISTS idx_wecom_user_mapping_dify_id
"""))
db.session.execute(text("""
CREATE INDEX idx_wecom_user_mapping_internal_id
ON wecom_user_mapping(internal_user_id)
"""))
# 删除旧字段
db.session.execute(text("""
ALTER TABLE wecom_user_mapping
DROP COLUMN dify_user_id
"""))
# 更新字段注释
db.session.execute(text("""
COMMENT ON COLUMN wecom_user_mapping.internal_user_id
IS '系统内部用户 ID'
"""))
# 2. 重命名 recommendation_records 表的旧字段
print("[migrate_001] 重命名 recommendation_records.dify_task_id -> task_id")
# 检查旧字段是否存在
result = db.session.execute(text("""
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'recommendation_records'
AND column_name = 'dify_task_id'
"""))
if result.fetchone():
# 添加新字段
db.session.execute(text("""
ALTER TABLE recommendation_records
ADD COLUMN task_id VARCHAR(64)
"""))
# 复制数据
db.session.execute(text("""
UPDATE recommendation_records
SET task_id = dify_task_id
"""))
# 删除旧字段
db.session.execute(text("""
ALTER TABLE recommendation_records
DROP COLUMN dify_task_id
"""))
# 更新表注释
db.session.execute(text("""
COMMENT ON TABLE wecom_user_mapping
IS '企微用户与内部系统用户映射表'
"""))
# 提交事务
db.session.commit()
print("[migrate_001] 迁移完成!")
return True
except Exception as e:
db.session.rollback()
print(f"[migrate_001] 迁移失败: {e}")
return False
if __name__ == "__main__":
from flask import Flask
from configs.app_config import AppConfig
app = Flask(__name__)
app.config.from_object(AppConfig)
with app.app_context():
migrate()