Andy
Andy

Reputation: 569

In SQLAlchemy, can I create an Engine from an existing ODBC connection?

I am working in an environment where I am given an ODBC connection, which has been created using credentials to which I don't have access (for security reasons). However I would like to access the underlying database using SQLAlchemy - so my question is, can I pass this ODBC connection to something like create_engine, or alternatively, wrap it in such a way that it looks like a SQLAlchemy connection?

As a supplementary question (and working on the optimistic assumption that the first part can be satisfied) is there a way that I can tell SQLA what dialect to use for the underlying RDBMS?

Thanks

Upvotes: 15

Views: 11311

Answers (2)

the-citto
the-citto

Reputation: 137

found this old post (14 years ago)

import sqlalchemy

sqlalchemy.create_engine('mssql://?dsn=mydsn')

my user case is for using jupyter SQL magics in new notebooks to be distributed to users which already have the DSN configured on their systems

for jupyter, after pip install ipython-sql:

import sqlalchemy

%load_ext sql

%sql mssql://?dsn=mydsn

tested on SQL Server 2019 with Windows authentication, as all info I found point that DSNs don't hold passwords for MSSQL

there's no reason why it shouldn't work on older versions (I'll use it on SQL Server 2005 too, of course with another DSN)

Upvotes: 0

zzzeek
zzzeek

Reputation: 75157

yes you can:

from sqlalchemy import create_engine
from sqlalchemy.pool import StaticPool
eng = create_engine("mssql+pyodbc://", poolclass=StaticPool, creator=lambda: my_odbc_connection)

however, if you truly have only one connection already created, as opposed to a callable that creates them, you must only use this engine in a single thread, one operation at a time. It is not threadsafe for use in a multithreaded application.

If OTOH you can actually get at a Python function that creates new connections whenever called, this is much more appopriate:

from sqlalchemy import create_engine
eng = create_engine("mssql+pyodbc://", creator=my_odbc_connection_function)

the above engine will pool connections normally and can be used freely as a source of connectivity.

Upvotes: 16

Related Questions