错误"不支持ODBC数据类型-150"将sqlalchemy连接到mssql时

时间:2016-10-06 20:00:19

标签: python sql-server sqlalchemy pyodbc

尝试将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()
    
  3. 两种方法都返回相同的错误:

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

如果您不确定您的版本:

>>import sqlalchemy
>>sqlalchemy.__version__

答案 2 :(得分:1)

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

试试这个:

SELECT CAST(GETDATE() AS DATETIME) AS dt

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

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