【问题标题】:"transaction is active" error while migrating django model迁移 django 模型时出现“事务处于活动状态”错误
【发布时间】:2018-10-31 21:22:11
【问题描述】:

我重命名了模型中的某个字段,然后运行

python manage.py makemigration # successful
python manage.py migrate

第二个命令我得到

NotSupportedError: SQLite 不支持在事务中重命名“my_model”。“my_column”,因为它会破坏参照完整性。尝试将atomic = False 添加到迁移类

但是,我看不出这意味着什么交易。在我收到该错误时,没有正在运行的 python 或 sqlite 进程。 sqlite 或 django 文件中是否有一些锁?我该如何解决这个问题??

【问题讨论】:

    标签: python django


    【解决方案1】:

    转到您已在其中重命名模型中某些字段的应用程序文件夹。 当你运行这个命令时

    python manage.py makemigration.

    这在迁移文件夹内的 app 文件夹中会生成一个迁移文件(最后一个文件,例如:000_initial)。

    在该迁移类中打开该文件将在该类的开头添加此内容。

    atomic = False

    它看起来像这样

    class Migration(migrations.Migration):
        atomic = False
    

    这将帮助您无错误地运行命令:

    python manage.py migrate

    更多参考检查:https://docs.djangoproject.com/en/2.1/howto/writing-migrations/

    【讨论】:

    • 感谢您的回答。但是,我的主要问题是如何检测正在运行的事务。我现在可以使用atomic=False,但从长远来看并不安全
    • 通过这种参照完整性,我可以说您尝试重命名的列已经是外键,或者在另一个表上创建了某些关系,因此无法重命名它会引发错误。在支持 DDL 事务的数据库(SQLite 和 PostgreSQL)上,默认情况下迁移将在事务内运行。用于在大型表上执行数据迁移等用例
    • 那么,“事务”是指实际的重命名,在sqlite内部?没有与 python 相关的东西??
    • 是的,它是同一个数据库事务。甚至您可以通过导入事务类在 Django 中手动运行事务。 atomic() 函数用于启动新事务并在事务完成时可以使用 on_commit()。
    猜你喜欢
    • 1970-01-01
    • 2019-11-23
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多