4

I'm trying to create a sqlalchemy engine using an existing psycopg2 connection.

My first approach is to try and extract a database URI from the psycopg2 connection, but this is failing due to security:

Calling connection.dsn prints all that's necessary to generate your connection string, but the password is obfuscated:

print(connection.dsn)

user=my_user password=xxx dbname=my_db host=localhost port=5432

similarly, calling connection.get_dsn_parameters() returns a dictionary without a password.

print(connection.get_dsn_parameters())

{'user': 'my_user', 'dbname': 'my_db', 'host': 'localhost', 'port': '5432', 'tty': '', 'options': '', 'sslmode': 'prefer', 'sslcompression': '0', 'krbsrvname': '***', 'target_session_attrs': 'any'}

I also see that if I had a connection pool, I could follow the approach from this SO answer, but I only have the connection.

I thought of faking a creator function, but I'm pretty sure this could backfire if sqlalchemy closes my one connection internally:

# connection exists in the scope
def get_conn():
  return connection

create_engine('postgresql+psycopg2://', creator=get_conn)

Any ideas?

Joey Baruch
  • 4,180
  • 6
  • 34
  • 48

0 Answers0