在SQLAlchemy中,可以从现有ODBC连接创建引擎吗?

15 投票
2 回答
9966 浏览
提问于 2025-04-18 07:00

我正在一个环境中工作,在这里我得到了一个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)

上面的引擎会正常地管理连接池,可以自由地用作连接的来源。

撰写回答