我正在一个我获得ODBC连接的环境中工作,该连接是使用我无法访问的凭据创建的(出于安全原因)。但是我想使用SQLAlchemy访问底层数据库 - 所以我的问题是,我可以将这个ODBC连接传递给类似create_engine的东西,或者以一种看起来像SQLAlchemy连接的方式包装它吗?
作为一个补充问题(并且乐观地假设第一部分可以满足)是否有一种方法可以告诉SQLA用于底层RDBMS的方言是什么?
由于
答案 0 :(得分:7)
是的,你可以:
from sqlalchemy import create_engine
from sqlalchemy.pool import StaticPool
eng = create_engine("mssql+pyodbc://", poolclass=StaticPool, creator=lambda: my_odbc_connection)
但是,如果您确实只创建了一个连接,而不是创建它们的可调用连接,那么必须只在一个线程中使用此引擎,一次只能使用一个操作。在多线程应用程序中使用它不是线程安全的。
如果OTOH你实际上可以获得一个Python函数,无论何时调用都会创建新的连接,这更适合:
from sqlalchemy import create_engine
eng = create_engine("mssql+pyodbc://", creator=my_odbc_connection_function)
上述引擎将正常汇集连接,可以自由使用作为连接源。