I'd like to log the queries that psycopg2 is making, but the psycopg2 documentation doesn't really specify how LoggingConnection should be used.
import logging
from psycopg2.extras import LoggingConnection
db_settings = {
"user": "abcd",
"password": "efgh",
"host": "postgres.db",
"database": "dev",
}
conn = LoggingConnection(**db_settings)
Gives an error
LoggingConnection(**db_settings) TypeError: function takes at most 2 arguments (5 given)
RealDictRow(cursor) A dict subclass representing a data record. Follow this answer to receive notifications.
Psycopg allows asynchronous interaction with other database sessions using the facilities offered by PostgreSQL commands LISTEN and NOTIFY .
Seems like setting the connection_factory=LoggingConnection
works
import logging
import psycopg2
from psycopg2.extras import LoggingConnection
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
db_settings = {
"user": "abcd",
"password": "efgh",
"host": "postgres.db",
"database": "dev",
}
conn = psycopg2.connect(connection_factory=LoggingConnection, **db_settings)
conn.initialize(logger)
cur = conn.cursor()
cur.execute("SELECT * FROM table LIMIT 5")
If you want to use LoggingConnection
directly, you need to provide the DSN as a libpq connection string to LoggingConnection()
- either a key/value connection string or a connection URI works:
from psycopg2.extras import LoggingConnection
DSN = "postgresql://john:secret@localhost/mydb"
#DSN = "host=localhost dbname=mydb user=john password=secret"
logfile = open('db.log', 'a')
conn = LoggingConnection(DSN)
conn.initialize(logfile)
cur = conn.cursor()
cur.execute('SELECT 1')
However, I would probably use a connection factory like @kristi demonstrated.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With