在尝试将pythonsqlalchemy连接到mssql服务器/数据库时,我一直遇到一个奇怪的错误。我需要使用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')"]
我不知道如何避免这个错误;当我在mssql中执行“SELECT SERVERPROPERTY('ProductVersion')”时,它工作正常,但返回的数据类型是“sql_variant”。在
有什么办法绕过这个问题吗?在
IIRC,这是因为您不能选择非强制转换函数目录,因为它们不返回pyodbc识别的数据类型。在
试试这个:
另外,您可能希望使用
CURRENT_TIMESTAMP
,这是ANSI标准SQL,而不是GETDATE()
:Retrieving date in sql server, CURRENT_TIMESTAMP vs GetDate()我不知道你的产品版本选择从何而来,但希望这能让你走上正确的道路。如果我们想得更多,我会修改答案。在
我今天升级到sqlalchemy 1.1,遇到了一个与之前正常工作的连接类似的问题。回到了1.0.15,没有问题。不是最好的答案,更多的是一个变通办法,但如果你在1.1版本,需要开始工作,它可能会起作用。在
如果您不确定您的版本:
这无疑是Issue 3814中引入的一个bug,它是SQLAlchemy 1.1.0中新增的,其中引入了
SELECT SERVERPROPERTY('ProductVersion')
来获取pyodbc MSSQL驱动程序的服务器版本。降级到1.0.15将使代码再次工作,但希望SQLAlchemy devs将使新版本的查找方案在新的补丁版本中更好地工作。在(在SQLAlchemy问题跟踪程序中已经报告了an issue,我会在那里添加此注释,但是bitbucket无法让我登录。)
相关问题 更多 >
编程相关推荐