You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:25:16