68 lines
2.2 KiB
Python
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完成!")
|