Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在SQLAlchemy中,我可以从现有的ODBC连接创建引擎吗?_Python_Sqlalchemy_Odbc - Fatal编程技术网

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

Python 在SQLAlchemy中,我可以从现有的ODBC连接创建引擎吗?,python,sqlalchemy,odbc,Python,Sqlalchemy,Odbc,我工作的环境中有一个ODBC连接,该连接是使用我无权访问的凭据创建的(出于安全原因)。但是,我希望使用SQLAlchemy访问底层数据库—所以我的问题是,我可以将此ODBC连接传递给类似于create_engine的东西,或者以类似SQLAlchemy连接的方式包装它吗 作为一个补充问题(并在第一部分可以满足的乐观假设下工作),是否有一种方法可以告诉SQLA底层RDBMS使用什么方言 谢谢是的,您可以: from sqlalchemy import create_engine from sqla

我工作的环境中有一个ODBC连接,该连接是使用我无权访问的凭据创建的(出于安全原因)。但是,我希望使用SQLAlchemy访问底层数据库—所以我的问题是,我可以将此ODBC连接传递给类似于create_engine的东西,或者以类似SQLAlchemy连接的方式包装它吗

作为一个补充问题(并在第一部分可以满足的乐观假设下工作),是否有一种方法可以告诉SQLA底层RDBMS使用什么方言

谢谢

是的,您可以:

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)

上述引擎将正常地汇集连接,并可作为连接源免费使用。

感谢您的帮助回答:-)我实际上是从工厂方法获得ODBC连接,因此我可以编写一个简单(非常简单)的包装器,按需生成连接。关于第二点(指定方言)有什么想法吗? 我确信我在SQLA文档中看到了一些这样做的方法,但是我可以;我现在找不到(有这么多东西:-)啊哈-我想我找到了-我只是更改了url的第一部分-加号前的一位-是吗?现在阅读更多关于create_引擎的文档,包括pool选项:-)唯一适合odbc的方言是MSSQL。其他选项包括MySQL或Sybase,但不确定它们的工作情况如何,因为它们很少使用。我们对其他类型的数据库没有ODBC支持(Pyodbc不支持)。那将很有趣-我实际上使用的是Netezza,并且一直希望我能用Postgres方言“过得去”-我想我必须适应MSSQL并解决异常。