在Postgres / SQLAlchemy上设置application_name

时间:2013-03-28 15:29:14

标签: postgresql sqlalchemy psycopg2

查看select * from pg_stat_activity;的输出,我看到一个名为application_name的列,描述为here

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

我想将此设置为有用的内容,例如web.1web.2等,以便稍后我可以将pg_stat_activity中看到的与我在我看到的内容相关联应用程序日志。

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

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

1 个答案:

答案 0 :(得分:35)

这个答案的结合是:

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

  

客户端库/服务器支持的任何其他连接参数都可以在连接字符串中传递,也可以作为关键字传递。 PostgreSQL文档包含supported parameters的完整列表。另请注意,可以使用环境变量将相同的参数传递给客户端库。

我们需要的变量是:

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")

或:

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