[英]Can't connect to Postgres from Django using a connection service file (on Windows)
[注意:這是使用 Django 4.0.2、Python 3.8.2 和 Postgres 14.2。]
我已經成功設置了 Django 和 Postgres,當我將所有 Postgres 參數放在 Django settings.py 文件中時,我可以讓它們一起工作。 但是,如Django 文檔中所示,我想改用 Postgres 連接服務文件。 我創建了一個如下所示的服務文件 (C:\Program Files\PostgreSQL\14\etc\pg_service.conf):
[test_svc_1]
host=localhost
user=django_admin
dbname=MyDbName
port=5432
使用此文件從命令行啟動 Postgres 似乎工作正常,因為它提示我輸入密碼:
> psql service=test_svc_1
Password for user django_admin:
但是,當我嘗試使用 Django 進行遷移時,出現以下錯誤:
Traceback (most recent call last):
File "C:\...\django\db\backends\base\base.py", line 219, in ensure_connection
self.connect()
File "C:\...\django\utils\asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "C:\...\django\db\backends\base\base.py", line 200, in connect
self.connection = self.get_new_connection(conn_params)
File "C:\...\django\utils\asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "C:\...\django\db\backends\postgresql\base.py", line 187, in get_new_connection
connection = Database.connect(**conn_params)
File "C:\Users\...\psycopg2\__init__.py",line 122, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: definition of service "test_svc_1" not found
還有其他與此相關的例外情況,例如:
django.db.utils.OperationalError: definition of service "test_svc_1" not found
但他們都指出找不到服務“test_svc_1”。
這是我的 Django settings.py 文件的摘錄。 添加 NAME 參數讓我更進一步,但是一旦 Django(?) 找到連接服務文件,我就不需要包含它。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': 'localhost',
'NAME': 'MyDbName',
'OPTIONS': {
'service': 'test_svc_1',
'passfile': '.my_pgpass',
},
},
}
關於我缺少什么的任何想法? 最壞的情況,我想我可以恢復使用環境變量並讓 settings.py 文件引用它們。 但我想了解我做錯了什么而不是放棄。
感謝您的任何指導。
萬一有人遇到這個問題,感謝 Ken Whitesell 在 Django 論壇上的一些指導,我終於可以使用服務和密碼文件了。 這是我需要做的:
我必須為指向這兩個文件的 PGPASSFILE 和 PSERVICEFILE 創建 Windows 環境變量。 我將它們都放在 C:\Program Files\PostgreSQL\14\etc 中,盡管我猜它們可以 go 進入其他目錄,只要環境變量指向它們。 接下來,我必須在 Django 的 settings.py 中修改我的數據庫記錄,如下所示(這與 Django 文檔指定的不同):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': 'localhost',
'NAME': 'MyDbName',
'OPTIONS': {
'service': 'test_svc_1',
},
},
}
OPTIONS 中的服務名稱需要與 PGSERVICEFILE 中的服務名稱匹配。
編輯:讓我添加一些解釋點以避免誤解。
Django 文檔是正確的,但我會添加一條關於在 Windows (帶有正斜杠/
)上定義路徑的注釋,正如他們在其他文檔中指出的那樣,需要寫入文件路徑。
您上面的方式(沒有密碼文件密鑰正在工作,因為您添加PGPASSFILE
passfile
變量並且psycopg2
從中讀取路徑。
但是您可以直接指定pgpass.conf
的路徑(或從環境變量中檢索它,請參見下面的注釋行) 。
數據庫主機和數據庫名稱也應該放在.pg_service.conf
文件中。 請參閱 PostgreSQL 文檔中的所有參數關鍵字。
考慮到這一點,以下文件示例應該可以工作(采用您的設置值) :
# Django `settings.py`
import os
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'OPTIONS': {
'service': 'test_svc_1',
# 'passfile': os.getenv("PGPASSFILE"),
'passfile': "C:/Program Files/PostgreSQL/14/etc/pgpass.conf",
},
}
}
# Django `settings.py` import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'OPTIONS': { 'service': 'test_svc_1', # 'passfile': os.getenv("PGPASSFILE"), 'passfile': "C:/Program Files/PostgreSQL/14/etc/pgpass.conf", }, } }
當然,必須存在pgpass.conf
中符合正確憑據的行:
#hostname:port:database:username:password localhost:5432:MyDbName:django_admin:your_secret
原來~/.pg_service.conf 文件中的服務名一定是數據庫名,即:[djangodb]。 之后就不需要傳遞 DBNAME。 並且環境變量應該只調用服務名稱,而不是文件路徑。 我在 Django 4 中也遇到了問題,無法使用 os.environ.get('VAR') 在 settings.py 文件中找到我的環境變量。 更改為 str(os.getenv('VAR')) 后,事情變得順利。 再見。
使用 Process Monitor 我發現文件的位置在 %APPDATA%\Roaming\postgresql\.pg_service.conf 將文件放在該位置沒有任何問題,我不必設置任何系統變量。 在文件中我輸入了主機、端口、用戶和密碼,在 django 設置中我只指定了數據庫和服務。 postgresql 文檔顯然不正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.