192 lines
5.9 KiB
Python
192 lines
5.9 KiB
Python
"""
|
||
修复缺失的 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)
|
||
|