【问题标题】:How to pass the driver parameter to sqlalchemy when using the creator parameter of create_engine使用create_engine的creator参数时如何将驱动参数传递给sqlalchemy
【发布时间】:2019-07-26 13:21:17
【问题描述】:

我有一个使用pyodbc.connect() (https://github.com/mkleehammer/pyodbc/wiki/Module#connect) 关键字功能的pyodbc 连接对象。

关键字包括驱动参数:

conn = pyodbc.connect(driver="SQL Server", server="myserver")

根据answer 的建议,我正在使用此连接通过creator 参数(docs) 传递给SQLAlchemy create_engine() 函数:

engine = create_engine("mssql+pyodbc://", creator=lambda: conn)

不过,creator 参数现在会忽略URL 参数中指定的连接参数:

使用此函数会导致绕过 URL 参数中指定的连接参数。

这意味着我在创建引擎时收到此警告消息:

SAWarning:未指定驱动程序名称;这是 PyODBC 在使用无 DSN 连接时所期望的 "未指定驱动程序名称;"

但是,将 sql 查询作为测试运行会返回正确的数据。如何将驱动程序信息(我假设它的 mssql+pyodbc)提供给 create_engine 函数以消除此警告?

【问题讨论】:

    标签: python sqlalchemy pyodbc


    【解决方案1】:

    看来您传递的是 DBAPI 连接,而不是创建者。尝试声明您的创建者函数:

    def creator():
        return pyodbc.connect(driver="SQL Server", server="myserver")
    

    并将函数(不是函数的评估)作为创建者的值传递:

    engine = create_engine("mssql+pyodbc://", creator=creator)
    

    【讨论】:

    • 函数调用中的lambda函数不会做同样的事情吗?:creator=lambda: conn
    • 那么 lambda 将始终返回相同的连接。我假设有多个线程并且 conn 没有被共享。如果它没有被共享,你可以尝试对每个线程进行全局处理,在这种情况下,lambda 会很好,你必须小心使用连接。但最常见的情况是,您希望每个线程都有一个连接,这就是返回新连接的函数很方便的原因。查询完成后,每个线程都会关闭其连接并将其返回到 de pool。
    • 嗯.. 更仔细地阅读 pyodbc 文档,似乎无法在线程之间共享连接:github.com/mkleehammer/pyodbc/wiki/Module#threadsafety(这是对当前 pyodbc 实现的限制,而不是一般的 odbc)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2014-11-12
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多