将sqlalchemy连接到mssq时出现错误“ODBC数据类型150不受支持”

2024-10-02 02:43:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在尝试将pythonsqlalchemy连接到mssql服务器/数据库时,我一直遇到一个奇怪的错误。我需要使用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”。在

有什么办法绕过这个问题吗?在


Tags: 方法importsqlalchemyasconnect错误saurllib
3条回答

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

试试这个:

SELECT CAST(GETDATE() AS DATETIME) AS dt

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

我不知道你的产品版本选择从何而来,但希望这能让你走上正确的道路。如果我们想得更多,我会修改答案。在

我今天升级到sqlalchemy 1.1,遇到了一个与之前正常工作的连接类似的问题。回到了1.0.15,没有问题。不是最好的答案,更多的是一个变通办法,但如果你在1.1版本,需要开始工作,它可能会起作用。在

如果您不确定您的版本:

>>import sqlalchemy
>>sqlalchemy.__version__

这无疑是Issue 3814中引入的一个bug,它是SQLAlchemy 1.1.0中新增的,其中引入了SELECT SERVERPROPERTY('ProductVersion')来获取pyodbc MSSQL驱动程序的服务器版本。降级到1.0.15将使代码再次工作,但希望SQLAlchemy devs将使新版本的查找方案在新的补丁版本中更好地工作。在

(在SQLAlchemy问题跟踪程序中已经报告了an issue,我会在那里添加此注释,但是bitbucket无法让我登录。)

相关问题 更多 >

    热门问题