在SQLAlchemy中,可以从现有ODBC连接创建引擎吗?
我正在一个环境中工作,在这里我得到了一个ODBC连接,这个连接是用一些我没有权限访问的账号信息创建的(出于安全原因)。不过我想用SQLAlchemy来访问底层的数据库,所以我想问一下,我能不能把这个ODBC连接传给像create_engine这样的函数,或者以某种方式把它包装起来,让它看起来像是一个SQLAlchemy的连接?
另外,我还有一个补充问题(假设第一个问题可以解决),有没有办法告诉SQLAlchemy使用什么方言来连接底层的关系数据库管理系统(RDBMS)?
谢谢!
2 个回答
0
我找到了一篇很久以前的帖子(14年前)
import sqlalchemy
sqlalchemy.create_engine('mssql://?dsn=mydsn')
我的使用场景是想在新的笔记本中使用 Jupyter 的 SQL 魔法,这些笔记本会分发给已经在他们的系统上配置好 DSN
的用户
对于 Jupyter,在运行 pip install ipython-sql
之后:
import sqlalchemy
%load_ext sql
%sql mssql://?dsn=mydsn
我在 SQL Server 2019 上测试过,使用的是 Windows 身份验证,因为我找到的所有信息都指向 DSN
不会保存 MSSQL 的密码
没有理由认为它在旧版本上不可以用(我当然也会在 SQL Server 2005 上使用,当然会用另一个 DSN
)
14
是的,你可以这样做:
from sqlalchemy import create_engine
from sqlalchemy.pool import StaticPool
eng = create_engine("mssql+pyodbc://", poolclass=StaticPool, creator=lambda: my_odbc_connection)
不过,如果你真的只有一个已经创建好的连接,而不是一个可以创建连接的函数,那么你必须在单个线程中使用这个引擎,一次只进行一个操作。它不适合在多线程的应用程序中使用。
另一方面,如果你能使用一个Python函数,每次调用时都能创建新的连接,那就更合适了:
from sqlalchemy import create_engine
eng = create_engine("mssql+pyodbc://", creator=my_odbc_connection_function)
上面的引擎会正常地管理连接池,可以自由地用作连接的来源。