ai-business-write/fix_missing_education_level_field.py

192 lines
5.9 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.

"""
修复缺失的 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)