当前位置: 首页 > 知识库问答 >
问题:

使用多个数据库的Django错误关系“auth_user”不存在

益光亮
2023-03-14

我正在使用多个数据库(在同一个postgresql数据库中使用不同的模式)处理Django1.9和python 3.3项目。当我第一次尝试迁移项目时,我得到了这个错误

Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying MyApp.0001_initial...Traceback (most recent call last):
  File "/usr/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: ERROR:  relation "auth_user" does not exist


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 10, in 
    execute_from_command_line(sys.argv)
  File "/usr/lib/python3.4/site-packages/django/core/management/__init__.py", line 350, in execute_from_command_line
    utility.execute()
  File "/usr/lib/python3.4/site-packages/django/core/management/__init__.py", line 342, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/python3.4/site-packages/django/core/management/base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/lib/python3.4/site-packages/django/core/management/base.py", line 399, in execute
    output = self.handle(*args, **options)
  File "/usr/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 200, in handle
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
  File "/usr/lib/python3.4/site-packages/django/db/migrations/executor.py", line 92, in migrate
    self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/usr/lib/python3.4/site-packages/django/db/migrations/executor.py", line 121, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/usr/lib/python3.4/site-packages/django/db/migrations/executor.py", line 198, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/usr/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 90, in __exit__
    self.execute(sql)
  File "/usr/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 110, in execute
    cursor.execute(sql, params)
  File "/usr/lib/python3.4/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/usr/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/usr/lib/python3.4/site-packages/django/db/utils.py", line 95, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/lib/python3.4/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/usr/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: ERROR:  relation "auth_user" does not exist

auth_user表未迁移时,此错误似乎会在其他项目中出现。在我的例子中,在迁移需要的应用程序之前,用manage.py迁移auth开始迁移并不能解决问题。

迁移过程是否在与我的应用程序数据库相同的数据库中查找auth_user表?是绝对不同的东西吗?

共有1个答案

席波娃
2023-03-14

它实际上是一个跨数据库引用问题。Django不能创建跨数据库外键。

来自Django1.8文档(在下一个版本中没有任何解决方案(当前版本是1.10)):

Django目前不支持外键或跨多个数据库的多对多关系。如果使用路由器将模型划分到不同的数据库,则由这些模型定义的任何外键和多对多关系都必须是单个数据库的内部关系。

如果在InnoDB中使用Postgres、Oracle或MySQL,这将在数据库完整性级别强制执行--数据库级别的密钥约束防止创建无法验证的关系。

但是,如果将SQLite或MySQL与MyISAM表一起使用,则没有强制的引用完整性;因此,您可能会“伪造”跨数据库外键。但是,Django并不正式支持这种配置

在我的例子中,因为路由器正在工作,所以有一点小技巧来简化跨数据库对象。

class CrossDBUser(models.Model):
    user = models.IntegerField()

    def get_user(self):
        return User.objects.get(id=self.user)

    def set_user(self, user):
        self.user = user.id

class MyClassWithCrossDB(CrossDBUser):
    field1 = models.CharField(max_length=200, blank=False)
    field2 = models.IntegerField(default=0)

当然,它并不完美,因为它不允许像on_delete=models.cascade这样的自动化操作,而且我不得不使用方法而不是实例变量。但这是一个变通的解决方案。

 类似资料:
  • 我在Django中创建了一个数据模型,它具有多对一关系(N个主题对1个用户),如下所示: 来自django。db从django导入模型。contrib。auth。模型导入用户 当我尝试在“管理”页面中加载数据模型时,出现以下错误: 我错过了数据模型中的什么吗? 谢谢。

  • 我有一个外键从一个模型到另一个模型在不同的数据库(我知道我不应该这样做,但如果我适当照顾参考完整性,它不应该是一个问题)。 问题是,一切正常...所有的系统做(关系在任何方向,路由器照顾它),但当我试图删除引用的模型(它没有外键属性)...Django仍然希望通过关系来检查关系是否为空,但是相关对象在另一个数据库中,所以它在这个数据库中找不到对象。 我试着在_delete=models上设置。什么

  • 问题内容: 我正在尝试将Django多数据库配置与MYSQL用作默认数据库,将redshift用作分析数据库。我的配置看起来像这样: 当我尝试迁移分析应用程序时,请使用以下命令 我看到以下错误: 关于如何解决此问题的任何想法?我正在使用和 问题答案: 特定的问题是:Django想要创建一个具有主键的迁移管理表来跟踪迁移历史。Redshift不支持。 但是,这种方法更普遍的问题是,您真的不希望在Re

  • 在对新的postgres数据库运行liquibase(3.5.3版)部署时,我们会遇到以下错误。表databasechangelog不是由liquibase创建的,但表databasechangeloglock是创建的。 有两种模式,ods和audit。搜索路径是ods,audit,public。我们在连接字符串中指定目标模式(currentSchema=audit)。此外,我们成功地运行了ods

  • :“查询执行失败。原因: SQL错误[42P01]:错误:关系”temp_table“存在。 不存在” 我想创建一个临时表来临时存储一些记录。

  • 问题内容: 我正在尝试在PostgreSQL 8.4.2 DB上运行hibernate模式。每当我尝试运行一个简单的Java代码,例如: 我收到以下错误: 由于我将选项hibernate.show_sql选项设置为true,因此可以看到hibernate尝试运行以下SQL命令: 实际上,它至少应运行以下命令: 有谁知道我需要进行哪些更改才能使Hibernate为PostgreSQL生成正确的SQL