4

psql を呼び出す必要がある Django アプリケーションがあります。私は次のようなセロリスレッドでこれを行います:

@task()
def insert_sqldump_threaded(username, database, file):
  host = database.server.db_address

  work = subprocess.Popen([settings.PSQL, 
                          "-f%s" % file, 
                          "-d%s" % database.db_name,
                          "-h%s" % host,
                          "-U%s" % settings.DB_ADMIN_USER
                          ], env = {'PGPASSFILE': settings.DB_PASSFILE}
                          )
  work.wait()
  return work.returncode

私の開発サーバーでは、PGPASSFILE は次のようになります。

localhost:5432:*:postgres:postgres

これで問題ありません。

問題は、この関数が呼び出されたときに得られるのは、psql からのエラーだけです。

psql: could not translate host name "localhost" to address: Unknown server error

そして今、それは本当に奇妙になりますが、「env」変数を送信しないと、psql はホストを認識しているようです。少なくとも、パスワードを要求します。

これを解決する方法についてのアイデアはありますか?

4

2 に答える 2

3

postgresql には、 を渡すときにクリアする他の環境変数が必要だと思いますenv。次のコードのように、単に os.environ を変更するか、事前にコピーを作成することができます。

import os
@task()
def insert_sqldump_threaded(username, database, file):
  d = dict(os.environ)
  d['PGPASSFILE'] = settings.DB_PASSFILE
  host = database.server.db_address

  work = subprocess.Popen([settings.PSQL, 
                          "-f%s" % file, 
                          "-d%s" % database.db_name,
                          "-h%s" % host,
                          "-U%s" % settings.DB_ADMIN_USER
                          ], env = d
                          )
  work.wait()
  return work.returncode
于 2011-02-16T17:27:24.110 に答える
0

envを送信しない場合、実行しているシェルから環境変数が取得されます。os.environを参照してください。ローカルホストを検索するためのものの1つに依存している必要があります。それを辞書に含める必要があります。または、os.environからすべてをコピーします。

于 2011-02-16T17:29:46.643 に答える