查看
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)。
我错过了什么明显的东西吗?
这个问题的答案是:
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"})
如果你正在使用
asyncpg
驱动程序,你应该使用
conn = await asyncpg.connect(server_settings={'application_name': 'foo'})
如果你使用 sqlalchemy 的
create_async_engine
,你可以使用,
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
create_async_engine(
...
connect_args={"server_settings": {"application_name": "app_name"}},
)
src-https://github.com/MagicStack/asyncpg/issues/204#issuecomment-333917251