在 Postgres/SQLAlchemy 上设置 application_name
Posted
技术标签:
【中文标题】在 Postgres/SQLAlchemy 上设置 application_name【英文标题】:Setting application_name on Postgres/SQLAlchemy 【发布时间】:2013-03-19 03:04:59 【问题描述】:查看select * from pg_stat_activity;
的输出,我看到一个名为application_name
的列,描述为here。
我看到 psql 正确设置了这个值(到 psql
...),但我的应用程序代码(psycopg2/SQLAlchemy)将它留空。
我想将此设置为有用的值,例如 web.1
、web.2
等,以便稍后将我在 pg_stat_activity
中看到的内容与我在应用程序日志中看到的内容关联起来。
我找不到如何使用 SQLAlchemy 设置此字段(如果推到了紧要关头 - 即使使用原始 sql;我在 Heroku 上使用 PostgresSQL 9.1.7,如果这很重要的话)。
我是否遗漏了一些明显的东西?
【问题讨论】:
【参考方案1】:这个问题的答案是:
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")
【讨论】:
嗯,等等。我不知道为什么,但这在我的开发数据库(9.1.4/OSX)上运行良好,但在 Heroku 的共享数据库(9.1.8/Linux)上运行良好(获取invalid connection option "application_name"
)。相同的 SA 版本,相同的 psycopg2 版本,可能不同的 libpq 等。但是psql application_name=foo_bar
在本地和针对 Heroku 都可以正常工作。有什么建议吗?
那将是 psycopg2 这样做。直接尝试 psycopg2 连接并仔细检查版本,以及它构建的 libpq 版本。
对于未来的读者,我会注意到 Heroku 的 libpq 默认来自 pg 8.4.9。看着 commit application_name
被添加了,我相信是在 8.4 被功能冻结之后。在与来自 Heroku 的@craigkerstiens 的chat 中,他确认这是可能 的原因,并建议我使用更新版本的libpq
供应商。
再一次,对于未来的读者来说,这里是vendor new libpq into your Heroku slug 并成功设置application_name
的艰巨方法。以上是关于在 Postgres/SQLAlchemy 上设置 application_name的主要内容,如果未能解决你的问题,请参考以下文章