Django PostgreSQL现有数据库不存在

时间:2019-12-03 18:21:24

标签: django postgresql psycopg2

我在PostgreSQL中有一个表tablename,表sub确实存在,它已经创建,已经添加了数据,并且当我在pgAdmin中运行SELECT * FROM sub.tablename时4,返回结果没有问题。

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

我不知道如何解决此问题,因为据我所知,此错误仅在人们尚未真正创建表或拼写错误的情况下显示。

ETA:连接到PostgreSQL而不是仅使用标准sqlite的目的是在生产中。我将拥有一个带有用户名和密码(例如tablename)的PostgreSQL表,用于登录到应用程序。不确定在这里是否有所作为。

下面是我在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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

删除除 init .py文件以外的所有迁移文件,然后再次运行makemigrations,如果迁移导致任何错误使用-

python manage.py migration --fake

这将伪造迁移过程,您将很高兴。

答案 2 :(得分:0)

我摆弄着东西,发现下面的配置终于对我有用。

SELECT A.a_id
FROM A
INNER JOIN B ON A.a_id = B.a_id
WHERE B.something IN ([list])
GROUP BY a_id
HAVING COUNT(*) = [length of list]
-- or in cases where B matches may be non-unique
-- HAVING COUNT(DISTINCT B.something) = [length of list] 

感谢大家的帮助!