簡體   English   中英

無法使用連接服務文件從 Django 連接到 Postgres(在 Windows 上)

[英]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 文檔的兩個區別:
  • 我需要包括數據庫名稱。
  • 我無法讓它與 OPTIONS 字典中的“passfile”條目一起使用,但是當我刪除它時它確實有效。 也許我做錯了什么,但我嘗試了幾個不同的選項和文件夾。

編輯:讓我添加一些解釋點以避免誤解。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM