Tortoise ORM:如何临时禁用MySQL外键检查?
在Tortoise ORM中临时禁用MySQL外键检查的方案
方法一:在迁移脚本中手动执行SQL
Tortoise ORM的迁移脚本支持直接运行原生SQL,你可以在迁移的upgrade/downgrade方法里,先禁用外键检查,执行完迁移逻辑后再恢复:
from tortoise import connections async def upgrade(): # 禁用外键检查 await connections.get("default").execute_script("SET foreign_key_checks = 0;") # 写入你的迁移操作,比如修改表结构、删除关联表等 await connections.get("default").execute_script("ALTER TABLE your_table DROP COLUMN related_id;") # 务必恢复外键检查 await connections.get("default").execute_script("SET foreign_key_checks = 1;")
重点是要保证最后恢复外键检查,避免后续操作破坏数据完整性。
方法二:封装迁移命令实现全局自动处理
如果所有迁移都需要临时禁用外键检查,可以自己写个脚本封装迁移流程,自动在前后开关外键约束:
import asyncio from tortoise import connections, run_async from tortoise.contrib.migrate import run_migrate async def run_migrations_safely(): # 初始化连接后禁用外键检查 await connections.get("default").execute_script("SET foreign_key_checks = 0;") # 执行迁移 await run_migrate() # 恢复外键检查 await connections.get("default").execute_script("SET foreign_key_checks = 1;") # 关闭所有连接 await connections.close_all() if __name__ == "__main__": run_async(run_migrations_safely())
用这个脚本替代原生的tortoise-orm migrate命令即可。
注意事项
- 只在必要场景(比如调整外键关联、删除依赖表)使用,不要长期禁用外键检查,否则会导致数据不一致。
- 多数据库环境下,要针对对应的连接执行SQL,替换
connections.get("default")中的连接名称。 - 无论哪种方法,都必须确保迁移完成后恢复
foreign_key_checks = 1。
内容的提问来源于stack exchange,提问作者rbm
相关产品推荐
相关产品推荐

