#!/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完成!")