2013-03-28 35 views
20

Nhìn vào đầu ra của select * from pg_stat_activity;, tôi thấy một cột có tên là application_name, được mô tả here.Đặt application_name trên Postgres/SQLAlchemy

Tôi thấy psql đặt giá trị này một cách chính xác (thành psql ...), nhưng mã ứng dụng của tôi (psycopg2/SQLAlchemy) để trống.

Tôi muốn đặt thứ này thành một thứ gì đó hữu ích, như web.1, web.2, v.v ... vì vậy sau này tôi có thể tương ứng với những gì tôi thấy trong pg_stat_activity với những gì tôi thấy trong nhật ký ứng dụng của mình.

Tôi không thể tìm cách thiết lập trường này bằng cách sử dụng SQLAlchemy (và nếu đẩy đến xô - ngay cả với sql thô; tôi đang sử dụng PostgresSQL 9.1.7 trên Heroku, nếu vấn đề đó).

Tôi có thiếu thứ gì đó hiển nhiên không?

Trả lời

27

câu trả lời cho điều này là một sự kết hợp của:

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

Bất kỳ tham số kết nối khác được hỗ trợ bởi các thư viện client/server có thể được thông qua một trong hai trong chuỗi kết nối hoặc từ khóa. Tài liệu PostgreSQL chứa danh sách đầy đủ của supported parameters. Cũng lưu ý rằng các tham số tương tự có thể được chuyển đến thư viện máy khách bằng cách sử dụng các biến môi trường.

nơi biến chúng ta cần là:

http://www.postgresql.org/docs/current/static/runtime-config-logging.html#GUC-APPLICATION-NAME

Các application_name thể được bất kỳ chuỗi dưới ký tự NAMEDATALEN (64 ký tự trong một tiêu chuẩn xây dựng). Nó thường được thiết lập bởi một ứng dụng khi kết nối với máy chủ. Tên sẽ được hiển thị trong chế độ xem pg_stat_activity và được bao gồm trong các mục nhập nhật ký CSV. Nó cũng có thể được bao gồm trong các mục nhật ký thông thường thông qua tham số log_line_prefix. Chỉ có thể sử dụng các ký tự ASCII có thể in được trong giá trị application_name. Các ký tự khác sẽ được thay thế bằng dấu chấm hỏi (?).

kết hợp với:

http://docs.sqlalchemy.org/en/rel_0_8/core/engines.html#custom-dbapi-args

đối số chuỗi dựa trên có thể được truyền trực tiếp từ chuỗi URL như các đối số truy vấn: (ví dụ ...) create_engine() cũng phải mất một connect_args luận là một từ điển bổ sung sẽ được chuyển tới kết nối(). Điều này có thể được sử dụng khi đối số của một loại khác với chuỗi được yêu cầu, và kết nối cơ sở dữ liệu SQLAlchemy của có không có logic loại chuyển đổi hiện nay cho rằng tham số

từ mà chúng ta nhận được:

e = create_engine("postgresql://scott:[email protected]/test?application_name=myapp") 

hay:

e = create_engine("postgresql://scott:[email protected]/test", 
       connect_args={"application_name":"myapp"}) 
+0

Hãy xem, tôi biết tôi đã bỏ lỡ điều gì đó hiển nhiên :) Cảm ơn bạn đã (và cho SA!) –

+0

Hmmm, đợi đã. Tôi không chắc chắn tại sao, nhưng điều này hoạt động tốt trên cơ sở dữ liệu phát triển của tôi (9.1.4/OSX) nhưng không phải trên cơ sở dữ liệu được chia sẻ của Heroku (9.1.8/Linux) (nhận 'tùy chọn kết nối không hợp lệ 'application_name" ').Phiên bản SA giống nhau, cùng một phiên bản psycopg2, có lẽ là libpq khác nhau, vv Nhưng 'psql application_name = foo_bar' hoạt động tốt, cả cục bộ và chống lại Heroku. Có lời khuyên nào không? –

+0

đó sẽ là psycopg2 làm điều đó. thử kết nối psycopg2 trực tiếp và kiểm tra kỹ phiên bản, cũng như phiên bản libpq được xây dựng dựa trên nó. – zzzeek