Reputation: 569
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
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 DSN
s 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
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