""" 修复缺失的 target_education_level 字段 检查并创建被核查人员文化程度字段 """ import pymysql import os from datetime import datetime # 数据库连接配置 DB_CONFIG = { 'host': os.getenv('DB_HOST', '152.136.177.240'), 'port': int(os.getenv('DB_PORT', 5012)), 'user': os.getenv('DB_USER', 'finyx'), 'password': os.getenv('DB_PASSWORD', '6QsGK6MpePZDE57Z'), 'database': os.getenv('DB_NAME', 'finyx'), 'charset': 'utf8mb4' } TENANT_ID = 615873064429507639 CREATED_BY = 655162080928945152 UPDATED_BY = 655162080928945152 CURRENT_TIME = datetime.now() # 字段定义 FIELD_DEFINITION = { 'name': '被核查人员文化程度', 'field_code': 'target_education_level', 'field_type': 2, # 输出字段 'description': '被核查人员文化程度(如:本科、大专、高中等)' } def generate_id(): """生成ID(使用时间戳+随机数的方式,模拟雪花算法)""" import time import random timestamp = int(time.time() * 1000) random_part = random.randint(100000, 999999) return timestamp * 1000 + random_part def check_field_exists(conn): """检查字段是否存在""" cursor = conn.cursor(pymysql.cursors.DictCursor) sql = """ SELECT id, name, filed_code, field_type, state FROM f_polic_field WHERE tenant_id = %s AND filed_code = %s """ cursor.execute(sql, (TENANT_ID, FIELD_DEFINITION['field_code'])) field = cursor.fetchone() cursor.close() return field def create_field(conn, dry_run: bool = True): """创建字段""" cursor = conn.cursor() field_id = generate_id() insert_sql = """ INSERT INTO f_polic_field (id, tenant_id, name, filed_code, field_type, created_time, created_by, updated_time, updated_by, state) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) """ if dry_run: print(f"[DRY RUN] 将创建字段:") print(f" ID: {field_id}") print(f" 名称: {FIELD_DEFINITION['name']}") print(f" 编码: {FIELD_DEFINITION['field_code']}") print(f" 类型: {FIELD_DEFINITION['field_type']} (输出字段)") print(f" 状态: 1 (启用)") else: cursor.execute(insert_sql, ( field_id, TENANT_ID, FIELD_DEFINITION['name'], FIELD_DEFINITION['field_code'], FIELD_DEFINITION['field_type'], CURRENT_TIME, CREATED_BY, CURRENT_TIME, UPDATED_BY, 1 # state: 1表示启用 )) conn.commit() print(f"✓ 成功创建字段: {FIELD_DEFINITION['name']} ({FIELD_DEFINITION['field_code']}), ID: {field_id}") cursor.close() return field_id def update_field_state(conn, field_id, dry_run: bool = True): """更新字段状态为启用""" cursor = conn.cursor() update_sql = """ UPDATE f_polic_field SET state = 1, updated_time = NOW(), updated_by = %s WHERE id = %s AND tenant_id = %s """ if dry_run: print(f"[DRY RUN] 将更新字段状态为启用: ID={field_id}") else: cursor.execute(update_sql, (UPDATED_BY, field_id, TENANT_ID)) conn.commit() print(f"✓ 成功更新字段状态为启用: ID={field_id}") cursor.close() def main(dry_run: bool = True): """主函数""" print("="*80) print("修复缺失的 target_education_level 字段") print("="*80) if dry_run: print("\n[DRY RUN模式 - 不会实际修改数据库]") else: print("\n[实际执行模式 - 将修改数据库]") try: conn = pymysql.connect(**DB_CONFIG) print("✓ 数据库连接成功\n") # 检查字段是否存在 print("1. 检查字段是否存在...") existing_field = check_field_exists(conn) if existing_field: print(f" ✓ 字段已存在:") print(f" ID: {existing_field['id']}") print(f" 名称: {existing_field['name']}") print(f" 编码: {existing_field['filed_code']}") print(f" 类型: {existing_field['field_type']} ({'输出字段' if existing_field['field_type'] == 2 else '输入字段'})") print(f" 状态: {existing_field['state']} ({'启用' if existing_field['state'] == 1 else '未启用'})") # 如果字段存在但未启用,启用它 if existing_field['state'] != 1: print(f"\n2. 字段存在但未启用,将更新状态...") update_field_state(conn, existing_field['id'], dry_run=dry_run) else: print(f"\n✓ 字段已存在且已启用,无需操作") else: print(f" ✗ 字段不存在,需要创建") print(f"\n2. 创建字段...") field_id = create_field(conn, dry_run=dry_run) if not dry_run: print(f"\n✓ 字段创建完成") print("\n" + "="*80) if dry_run: print("\n这是DRY RUN模式,未实际修改数据库。") print("要实际执行,请运行: python fix_missing_education_level_field.py --execute") else: print("\n✓ 字段修复完成") except Exception as e: print(f"\n✗ 发生错误: {e}") import traceback traceback.print_exc() if not dry_run: conn.rollback() finally: conn.close() print("\n数据库连接已关闭") if __name__ == '__main__': import sys dry_run = '--execute' not in sys.argv if not dry_run: print("\n⚠ 警告: 这将修改数据库!") response = input("确认要继续吗? (yes/no): ") if response.lower() != 'yes': print("操作已取消") sys.exit(0) main(dry_run=dry_run)