尝试将python sqlalchemy连接到msssql服务器/数据库时,我遇到了一个奇怪的错误。我需要使用sqlalchemy(根据我所说的)将pandas数据帧连接到mssql的唯一方法。
我尝试过两种不同的方式连接sqlalchemy:
使用完整连接字符串:
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()
使用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')"]
我不确定如何解决这个错误;当我执行" SELECT SERVERPROPERTY(' ProductVersion')"在mssql中,它工作正常,但返回的数据类型为" sql_variant"。
有没有办法解决这个问题?
答案 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()
我不确定您选择的产品版本来自哪里,但希望这会让您走上正确的道路。如果我们想出更多的话,我会修改答案。