在Postgres/SQLAlchemy上设置application_name

Yan*_*nin 31 postgresql sqlalchemy psycopg2

看一下输出select * from pg_stat_activity;,我看到一个名为的列application_name,在这里描述.

我看到psql正确设置了这个值(到psql...),但我的应用程序代码(psycopg2/SQLAlchemy)将它留空.

我想将它设置为有用的东西,比如web.1,web.2等等,所以我可以稍后关联什么,我看到pg_stat_activity与我在我的应用程序日志中看到.

我找不到如何使用SQLAlchemy设置这个字段(如果push推进 - 即使使用原始sql;我在Heroku上使用PostgresSQL 9.1.7,如果这很重要).

我错过了一些明显的东西吗

zzz*_*eek 43

答案是:

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_args,这是一个将传递给connect()的附加字典.当需要除字符串以外的类型的参数,并且SQLAlchemy的数据库连接器没有为该参数提供类型转换逻辑时,可以使用此方法

从那我们得到:

e = create_engine("postgresql://scott:tiger@localhost/test?application_name=myapp")
Run Code Online (Sandbox Code Playgroud)

要么:

e = create_engine("postgresql://scott:tiger@localhost/test", 
              connect_args={"application_name":"myapp"})
Run Code Online (Sandbox Code Playgroud)

  • 对于未来的读者,我会注意到Heroku的libpq默认来自pg 8.4.9.看看[commit](https://github.com/postgres/postgres/commit/8217cfbd991856d25d73b0f7afcf43d99f90b653)`application_name`被添加了,我相信它是在8.4之后被冻结的功能.在与来自Heroku的@craigkerstiens的[聊天](https://twitter.com/aknin/status/317730900093849600)中,他确认这是*可能*的原因并建议我在较新版本的`libpq`中提供. (2认同)
  • 再次,对于未来的读者,这是[供应商新的 libpq 到你的 Heroku slug](http://stackoverflow.com/questions/15725974/setting-postgres-application-name-on-heroku) 并设置`application_name` 的艰难方法成功地。 (2认同)