Django 1.8 和 syncdb / migrate 的 auth_user 错误

Posted

技术标签:

【中文标题】Django 1.8 和 syncdb / migrate 的 auth_user 错误【英文标题】:auth_user error with Django 1.8 and syncdb / migrate 【发布时间】:2015-06-23 17:22:49 【问题描述】:

当升级到 Django 1.8(使用 zc.buildout)并运行 syncdb 或 migrate 时,我收到以下消息:

django.db.utils.ProgrammingError: relation "auth_user" does not exist

我的一个模型包含 django.contrib.auth.models.User:

user = models.ForeignKey(
    User, related_name='%(app_label)s_%(class)s_user',
    blank=True, null=True, editable=False
)

降级到 Django 1.7 可以消除该错误。我必须在 Django 1.8 中以不同的方式包含 User 对象吗?

【问题讨论】:

在我的环境中,这只发生在使用Postgre 【参考方案1】:

也许您已经找到答案并解决了问题,但我想指出,就我而言,上述问题已通过删除数据库并以用户的全部权限重新创建来解决。我能够这样做是因为我在非生产环境中工作,但在暂存环境中这样做并不是一个好主意,所以要小心。

我使用python 2.7.12,以下是我的 virtualenv 的规格:

Django==1.10.5
django-crispy-forms==1.6.1
django-registration-redux==1.4
djangorestframework==3.5.3
olefile==0.44
packaging==16.8
Pillow==4.0.0
psycopg2==2.6.2

【讨论】:

非常感谢“cavpollo”的更正。它看起来肯定更好。 删除并重新创建数据库是唯一对我有用的方法。之后,我运行了 python manage.py migrate,然后问题就解决了。之后我要做的就是创建另一个超级用户。【参考方案2】:

对所有尚未迁移的应用程序运行“makemigrations”可以解决此问题,即迁移目录中还没有“initial_0001.py”文件的应用程序。

这是通过运行以下每个应用程序来完成的(在我们的例子中,我们使用一个 makefile):

manage.py makemigrations app_name

完成后,您可以执行:

manage.py migrate

像往常一样。

造成这种情况的根本原因是由于某种原因

manage.py makemigrations

是否总是创建这些初始迁移,如果它们不存在的话。这导致了上述错误。

相反,

manage.py makemigrations app_name

确实总是创建它们(如果还没有的话)。不幸的是,我无法理解造成这种不对称的原因。

【讨论】:

你在哪个目录运行命令?我收到错误“无法打开文件 manage.py”。 您应该在包含文件“manage.py”的目录中运行该命令。您可以尝试以下 2 种替代方法:1) 在命令前添加点斜杠,例如:“./manage.py makemigrations”或 2) 在命令前添加 python 可执行文件,例如:“python manage.py makemigrations”。祝你好运。 但这在哪里? 在与您的应用程序目录所在的同一目录中,请参阅此处了解目录布局(我无法将其粘贴到此处),查找“创建项目”:docs.djangoproject.com/en/1.9/intro/tutorial01。如果你不再拥有它,你应该更换它。顺便说一句:你也可以使用“django-admin”,它应该在你的 Python 路径中,另见:docs.djangoproject.com/en/1.9/ref/django-admin【参考方案3】:

我已经将一个旧的 Django 1.6 项目迁移到 Django 1.8,之前我们使用过 syncdb 来迁移数据库,并且对于我们项目中的所有应用,我们没有初始迁移步骤。使用 Django 1.8,您将需要一个有效的数据库迁移。运行

manage.py makemigrations <app_name>

我们项目中的所有应用都解决了我们的问题。

【讨论】:

【参考方案4】:

如果你像我一样使用 heroku

heroku run python manage.py makemigrations

这可能会给您一条消息,说明现在有更改。忽略然后运行

heroku run python manage.py migrate

这将为您提供一些输出,表明某些事情已经完成。 最后运行

heroku run python manage.py createsuperuser

【讨论】:

【参考方案5】:

为了解决这个问题,我就是这样做的:

1) 在您的项目中查找所有外键关系字段,如 OneToOneField、ForeignKey 和 ManyToManyFields,包括引用 auth.User 或导入 User 并将其设置为 settings.AUTH_USER_MODEL 的任何可重用应用程序。最少使用:

'auth.User'

2) 对于所有具有上述条件的模型,确保模型具有有效的 django 迁移(不是南)。如果他们有南迁移,请将目录重命名为 migrations_south,然后为该应用运行 makemigrations 命令:

./manage.py makemigrations affected_app

有时会有一个不同名称的 django 迁移文件夹,而不是默认的 migrations 目录。在这种情况下,请在您的 settings.py 中通过MIGRATION_MODULES 引用它:

MIGRATION_MODULES = 'filer': 'filer.migrations_django'

由于在大型项目中很难找到该问题,我在 settings.py 中注释掉了 INSTALLED_APPS 中的所有自定义应用程序并运行了测试命令,因为它将运行 migrate 并尝试为您重新创建数据库:

./manage.py test

看起来这对我来说已经解决了。我不确定第 1 步是强制性的还是只是最佳实践。但您肯定需要将应用程序转换为迁移。

干杯!

PS。为即将到来的Django 1.9 做好准备。 syncdb 命令将被删除。无需迁移即可同步应用的传统方法已被移除,所有应用都必须进行迁移。

【讨论】:

【参考方案6】:

在我的环境中,我在与django.contrib.auth.models 有关系的所有应用程序上修复了此运行makemigrations

manage.py makemigrations app_with_user_relation manage.py 迁移

【讨论】:

我遇到了同样的问题,这个解决方案有效。从 Django 1.7.X 传递到 1.8.1 我可以确认这仍然有效,并且可以与 Heroku 一起使用。 这个解决方案在 D2.2 中为我工作了一个非常不相关的问题。试图运行单元测试并不断收到此错误。结果发现用户应用程序中有一个延迟迁移需要手动运行(即makemigrations users),突然我的单元测试模块开始运行。【参考方案7】:

我通过先运行 auth 来解决这个问题,然后是我的其余迁移:

python manage.py migrate auth
python manage.py migrate

【讨论】:

您的 auth 应用程序应该已经在 INSTALLED_APPS 的顶部附近,即“django.contrib.admin”,如果它的顺序正确,则上述内容不会有任何影响。 我收到 relation "django_site" does not exist 。我在 django 1.8.2 上。我在我的项目中尝试了几个不同的应用程序,但总是遇到同样的错误,然后我再次运行python manage.py migrate,你瞧,它成功了。【参考方案8】:

尝试使用这个来指代用户

from django.conf import settings
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='%(app_label)s_%(class)s_user', blank=True, null=True, editable=False)

【讨论】:

对我不起作用。我没有迁移,只是尝试运行 ./manage.py 测试,并且在运行迁移时立即失败:django.db.utils.ProgrammingError:关系“auth_user”不存在 修复方法是让依赖于 auth_model 外键的模型也处于迁移状态。由于 Django 1.9 中没有同步数据库,因此总体而言是一种良好的做法

以上是关于Django 1.8 和 syncdb / migrate 的 auth_user 错误的主要内容,如果未能解决你的问题,请参考以下文章

Django-MySQL 启用 Row_Format=使用 syncdb 压缩

Django manage.py syncdb 不工作

在 Django 1.9 中我应该使用啥来代替 syncdb?

Django 迁移在 Heroku 中失败

django 在服务器上的 syncdb 期间出错

使用继承和ForeignKey时Django syncdb冲突related_name