【问题标题】:Django PostgreSQL existing database does not existDjango PostgreSQL 现有数据库不存在
【发布时间】:2019-12-03 18:21:24
【问题描述】:

我在 PostgreSQL 中有一个表 tablename,其架构 sub 肯定存在——它已创建,已添加数据,当我在 pgAdmin 4 中运行 SELECT * FROM sub.tablename 时,它返回的结果没有问题。

当我尝试在我的 Django 应用程序中访问同一个表时,它会产生错误 psycopg2.OperationalError: FATAL: database "main.sub.tablename" does not exist。我尝试将表名设为sub.tablenametablename,但它仍然声称该表不存在。我是sub 的所有者,它是我用于访问该表的凭据。我已经确认主机名和端口是应该的。

我不知道如何解决此问题,因为据我所知,此错误仅在人们尚未实际创建表或拼写错误时才会出现。

ETA: 连接到 PostgreSQL 而不是仅仅使用标准 sqlite 的关键在于生产中我将有一个 PostgreSQL 表,其中包含用户名和密码(如 tablename)用于登录应用。不确定这是否会有所不同。

下面是我在settings.py 中的相关代码简介,其中出现了表/数据库信息。

settings.py

DATABASES = {
    'default': {
        'NAME': 'tablename',
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '1234',
    }
}

追溯

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 194, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/postgresql/base.py", line 178, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/usr/local/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL:  database "opr.opr_user_test" does not exist

【问题讨论】:

  • 你的迁移是什么?他们为您处理所有这些。您是否为适当的模型创建并迁移了它们?
  • 如果数据库不存在,我认为 Django 不会为我们创建数据库。
  • @Hanny 是的,当我在 Docker 容器中构建我的应用程序时,我会运行迁移,这会触发表不存在错误。
  • @JPG 是的,我知道,但是这个表存在。
  • 如果它说它不存在,它很可能不存在。当你构建你的 Docker 时,你是在重建数据库和表吗?当您关闭 Docker 并重新构建它时,您的数据库是否仍然存在?也许当您重建容器并且您没有在启动脚本中重新创建它时,该表被拆除了。我见过这种情况。所以你认为它应该在那里,但实际上并非如此。

标签: django postgresql psycopg2


【解决方案1】:

删除除了 init.py 文件之外的所有迁移文件,然后再次运行 makemigrations,如果 migrate 给出任何错误使用 -

python manage.py migrate --fake

这会伪造迁移过程,您可以继续使用。

【讨论】:

    【解决方案2】:

    检查 settings.py 中的数据库名称,它应该是 'sub' 而不是 'tablename'。
    试试这个:

    DATABASES = {
        'default': {
            'NAME': 'sub',
            'ENGINE': 'django.db.backends.postgresql',
            'USER': 'username',
            'PASSWORD': 'password',
            'HOST': 'localhost',
            'PORT': '1234',
        }
    }
    

    【讨论】:

    • 仍然出现同样的错误,它说psycopg2.OperationalError: FATAL: database "sub" does not exist
    【解决方案3】:

    我摆弄了一下,发现下面的配置终于对我有用了。

    DATABASES = {
        'default': {
            'NAME': 'main',
            'ENGINE': 'django.db.backends.postgresql',
            'OPTIONS': {
                'options': '-c search_path=sub'
            },
            'USER': 'username',
            'PASSWORD': 'password',
            'HOST': 'localhost',
            'PORT': '1234',
        }
    }
    

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 2019-12-06
      • 2016-12-07
      • 1970-01-01
      相关资源
      最近更新 更多