gpt4 book ai didi

django - 重命名 auth_user 会中断新设置的迁移

转载 作者:行者123 更新时间:2023-12-04 12:20:49 27 4
gpt4 key购买 nike

关注以下内容 good advice , 我是从 Django 的内置迁移过来的 auth.User给我自己 app.User通过执行重命名 auth_user 的迁移至 app_user .到目前为止一切顺利,这工作正常。当我设置一台新机器时,问题就来了。

在我的 settings.py我有 AUTH_USER_MODEL = 'app.User' .正因为如此,当我运行 syncdb , auth_user表没有创建,所以当我 migrate ,迁移失败。

我发现解决此问题的唯一方法是修改 AUTH_USER_MODEL指向 auth.User , 运行 syncdb和迁移直到重命名迁移,然后更改 AUTH_USER_MODEL返回,然后运行其余的迁移。

有没有办法解决这个问题?

最佳答案

根据您提到的问题,我首先尝试的方法是修改执行表重命名的迁移以检查是否应执行重命名。不幸南does not readily cooperate用这种检查。如果失败,大多数更高级别的操作会完全中止迁移。但是,您可以使用 db.execute 如果失败,它将引发异常。就像是:

from django.db.utils import ProgrammingError
from south.db import db

exists = False
db.start_transaction()
try:
# Will fail if the destination table does not exist.
# Any typo here will yield incorrect results. Be careful.
db.execute("select count(*) from auth_user")
# If we get here, the table exists
exists = True
except ProgrammingError:
pass

# Always end the transaction we started, rollback or commit shouldn't matter.
db.rollback_transaction()

if exists:
db.rename_table...
else:
# The table does not exist, create new one.
db.create_table...

我的测试表明,始终可以捕获 South 的数据库调用引发的错误。但是,在出现 SQL 错误后,South 不会进行清理。 (这是我最初在这个答案的第一个版本中错过的。)因此,即使异常被捕获,将启动的下一个 SQL 操作也会发现连接处于错误状态。换句话说,在失败的操作之后发生的操作将因为前一个操作失败而失败。这就是 db.start_transaction()的原因和 db.rollback_transaction()调用。即使出现 SQL 错误,这也会使操作干净利落地结束。

关于django - 重命名 auth_user 会中断新设置的迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24928273/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com