web-dev-qa-db-ja.com

Postgres / SQLAlchemyでのapplication_nameの設定

select * from pg_stat_activity;の出力を見ると、説明されているapplication_nameという列があり、 ここに記載されています

Psqlがこの値を正しく(psql...に)設定しているのを確認しましたが、アプリケーションコード(psycopg2/SQLAlchemy)は空白のままにします。

これをweb.1web.2などの便利なものに設定したいので、後でpg_stat_activityに表示される内容とアプリケーションログに表示される内容を関連付けることができます。

私はSQLAlchemyを使用してこのフィールドを設定する方法を見つけることができませんでした(そして、Pushが突き出た場合-生のSQLでも-HerokuでPostgresSQL 9.1.7を使用しています)。

明らかなものがないのですか?

32
Yaniv Aknin

これに対する答えは次の組み合わせです。

http://initd.org/psycopg/docs/module.html#psycopg2.connect

クライアントライブラリ/サーバーでサポートされている他の接続パラメーターは、接続文字列またはキーワードとして渡すことができます。 PostgreSQLのドキュメントには サポートされているパラメーター の完全なリストが含まれています。また、環境変数を使用して同じパラメーターをクライアントライブラリに渡すこともできます。

必要な変数は次のとおりです。

http://www.postgresql.org/docs/current/static/runtime-config-logging.html#GUC-APPLICATION-NAME

Application_nameは、NAMEDATALEN文字(標準ビルドでは64文字)未満の任意の文字列にすることができます。通常、サーバーへの接続時にアプリケーションによって設定されます。名前はpg_stat_activityビューに表示され、CSVログエントリに含まれます。また、log_line_prefixパラメータを介して通常のログエントリに含めることもできます。 application_name値では、印刷可能なASCII文字のみを使用できます。他の文字は疑問符(?)に置き換えられます。

と組み合わせ :

http://docs.sqlalchemy.org/en/rel_0_8/core/engines.html#custom-dbapi-args

文字列ベースの引数は、クエリ引数としてURL文字列から直接渡すことができます:(例...)create_engine()は、connect()に渡される追加の辞書である引数connect_argsも受け取ります。これは、文字列以外の型の引数が必要で、SQLAlchemyのデータベースコネクタにそのパラメーターの型変換ロジックがない場合に使用できます。

それから私たちは得る:

e = create_engine("postgresql://scott:tiger@localhost/test?application_name=myapp")

または:

e = create_engine("postgresql://scott:tiger@localhost/test", 
              connect_args={"application_name":"myapp"})
39
zzzeek