postgresql 在Postgres/SQLAlchemy上设置应用程序名称

a14dhokn  于 2023-01-12  发布在  PostgreSQL
关注(0)|答案(2)|浏览(158)

查看select * from pg_stat_activity;的输出,我看到一个名为application_name的列,如下所述。
我看到psql正确地设置了这个值(到psql...),但是我的应用程序代码(psycopg 2/SQLAlchemy)把它留空了。
我希望将其设置为一些有用的值,如web.1web.2等,以便稍后将pg_stat_activity中的内容与应用程序日志中的内容关联起来。
我找不到如何使用SQLAlchemy设置这个字段(如果推到推-即使是原始sql;我在Heroku上使用PostgresSQL 9.1.7,如果这有关系的话)。
我错过了什么明显的东西吗?

ogq8wdun

ogq8wdun1#

这个问题的答案是以下因素的组合:
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")

或:

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

ckx4rj1h2#

如果使用asyncpg驱动程序,则应使用

conn = await asyncpg.connect(server_settings={'application_name': 'foo'})

源代码-https://github.com/MagicStack/asyncpg/issues/204#issuecomment-333917251

相关问题