【问题标题】:Error "ODBC data type -150 is not supported" when connecting sqlalchemy to mssql将 sqlalchemy 连接到 mssql 时出现错误“不支持 ODBC 数据类型 -150”
【发布时间】:2017-02-15 17:05:42
【问题描述】:

尝试将 python sqlalchemy 连接到 msssql 服务器/数据库时,我一直遇到一个奇怪的错误。我需要使用 sqlalchemy,因为它是(据我所知)将 pandas 数据帧连接到 mssql 的唯一方法。

我尝试了两种不同的方式连接 sqlalchemy:

  1. 使用完整的连接字符串:

    import sqlalchemy as sa
    import urllib.parse as ulp
    
    usrCnnStr = r'DRIVER={SQL Server};SERVER=myVoid\MYINSTANCE;Trusted_Connection=yes;'
    usrCnnStr = ulp.quote_plus(usrCnnStr)
    usrCnnStr = "mssql+pyodbc:///?odbc_connect=%s" % usrCnnStr
    
    engine = sa.create_engine(usrCnnStr)
    connection = engine.connect()
    connection.execute("select getdate() as dt from mydb.dbo.dk_rcdtag")
    connection.close()
    
  2. 使用 DSN:

    import sqlalchemy as sa
    import urllib.parse as ulp
    
    usrDsn = 'myDb'
    params = ulp.quote_plus(usrDsn)
    engine = sa.create_engine("mssql+pyodbc://cryo:pass@myDb")
    conn = engine.connect()
    conn.execute('select getdate() as dt')
    conn.close()
    

两种方法都返回相同的错误:

sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('ODBC data type -150 is not supported.  Cannot read column .', 'HY000') [SQL: "SELECT  SERVERPROPERTY('ProductVersion')"]

我不知道如何解决这个错误;当我在 mssql 中执行“SELECT SERVERPROPERTY('ProductVersion')”时,它工作正常,但返回的数据类型为“sql_variant”。

有没有办法解决这个问题?

【问题讨论】:

  • 您是否尝试过先通过pyodbc 直接连接?你使用的是什么版本的 Python、pyodbc 和 SQL Alchemy?
  • @FlipperPA 我尝试使用 pyodbc 进行连接(这是我的第一选择),但 pandas Dataframe.to_sql() 在连接到 mssql 数据库时需要 sqlalchemy 连接。
  • @zzzeek 经过测试并确认问题已通过 sqlalchemy v1.1.1 解决 - 谢谢!

标签: python sql-server sqlalchemy pyodbc


【解决方案1】:

IIRC,这是因为您不能选择非强制转换函数目录,因为它们不返回 pyodbc 识别的数据类型。

试试这个:

SELECT CAST(GETDATE() AS DATETIME) AS dt

另外,您可能希望使用CURRENT_TIMESTAMP,这是 ANSI 标准 SQL,而不是 GETDATE()Retrieving date in sql server, CURRENT_TIMESTAMP vs GetDate()

我不确定您选择的产品版本来自哪里,但希望这能让您走上正确的道路。如果我们弄清楚更多,我会修改答案。

【讨论】:

  • 选择查询实际上只是一个占位符,但我用你指定的那个运行它,仍然得到同样的错误。 “select serverproperty('ProductVersion')”来自错误的尾部。
【解决方案2】:

我今天升级到 sqlalchemy 1.1 并遇到了与以前工作的连接类似的问题。回到 1.0.15 并没有问题。不是最佳答案,更多的是一种解决方法,但如果您使用的是 1.1 并且需要滚动,它可能会起作用。

如果您不确定自己的版本:

>>import sqlalchemy
>>sqlalchemy.__version__

【讨论】:

  • 我刚刚检查过,我使用的是 1.1.0 版;我该如何降级?
  • 只需要卸载 sqlalchemy,例如 pip uninstall sqlalchemy 然后你可以执行 pip install 然后这个 URL:pypi.python.org/packages/18/7d/…
  • 这解决了问题。我能够使用 pip 卸载然后手动下载 1.0.15 并使用 pip 再次安装它。谢谢!
【解决方案3】:

这肯定是Issue 3814 中引入的一个错误,它是 SQLAlchemy 1.1.0 中的新功能,他们在其中引入了SELECT SERVERPROPERTY('ProductVersion') 来获取 pyodbc MSSQL 驱动程序的服务器版本。降级到 1.0.15 将使代码再次工作,但希望 SQLAlchemy 开发人员能让新版本查找方案在新的补丁版本中更好地工作。

(SQLAlchemy 问题跟踪器中已经报告了an issue,我会在此处添加此评论,但 bitbucket 无法让我登录。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 2016-08-13
    • 1970-01-01
    • 2015-12-29
    • 2021-11-13
    • 1970-01-01
    • 2011-10-02
    • 2013-03-15
    相关资源
    最近更新 更多