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

cry*_*tik 2 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()
    
    Run Code Online (Sandbox Code Playgroud)
  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()
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Tho*_*röm 5

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

(这里有一个问题,在SQLAlchemy的问题跟踪已经报告,我想补充一点意见没有,但到位桶无法登录我).