Files
Django/fix_fk.py

68 lines
2.2 KiB
Python

#!/usr/bin/env python3
"""修复 yonghu_dianpu_bangding 表的 FK 约束"""
import MySQLdb
from app_secrets import DATABASE_HOST, DATABASE_PORT, DATABASE_USER, DATABASE_PASSWORD, DATABASE_NAME
conn = MySQLdb.connect(
host=DATABASE_HOST, port=int(DATABASE_PORT),
user=DATABASE_USER, password=DATABASE_PASSWORD,
database=DATABASE_NAME, charset='utf8mb4'
)
cursor = conn.cursor()
# 1. 查看所有引用 User 表的 FK 约束
cursor.execute("""
SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = %s AND REFERENCED_TABLE_NAME = 'User'
""", [DATABASE_NAME])
fks = cursor.fetchall()
print("引用 User 表的 FK 约束:")
for fk in fks:
print(f" {fk[0]}: {fk[1]}.{fk[2]} -> {fk[3]}.{fk[4]}")
# 2. 删除所有引用 User.UserUID 的 FK 约束(类型不兼容的)
for fk in fks:
if fk[4] == 'UserUID': # 引用了 UserUID (varchar) 而不是 UserUUID (binary)
constraint_name = fk[0]
table_name = fk[1]
print(f"\n删除不兼容 FK: {constraint_name} on {table_name}")
try:
cursor.execute(f"ALTER TABLE `{table_name}` DROP FOREIGN KEY `{constraint_name}`")
conn.commit()
print(f" 已删除 {constraint_name}")
except Exception as e:
print(f" 删除失败: {e}")
# 3. 修改 yonghu_dianpu_bangding.UserUUID 列类型
print("\n修改 yonghu_dianpu_bangding.UserUUID 列类型...")
try:
cursor.execute("ALTER TABLE yonghu_dianpu_bangding MODIFY COLUMN UserUUID binary(16) NOT NULL")
conn.commit()
print(" 修改成功")
except Exception as e:
print(f" 修改失败: {e}")
# 4. 重新添加 FK 约束
print("\n重新添加 FK 约束...")
try:
cursor.execute("""
ALTER TABLE yonghu_dianpu_bangding
ADD CONSTRAINT yonghu_dianpu_bangding_UserUUID_fk
FOREIGN KEY (UserUUID) REFERENCES User(UserUUID)
""")
conn.commit()
print(" FK 约束添加成功")
except Exception as e:
print(f" FK 约束添加失败: {e}")
# 5. 验证
print("\n验证表结构:")
cursor.execute("DESCRIBE yonghu_dianpu_bangding")
for row in cursor.fetchall():
print(f" {row}")
conn.close()
print("\n完成!")