熊猫read_sql:转换数据类型时出错

时间:2020-07-21 22:34:52

标签: python sql-server pandas

我有一个相对简单的任务,即查询SQL Server数据库并将结果放入pandas数据框。但是,我遇到了一些我找不到的问题。

我希望有人可以指出这一点,而不是依赖于数据。

考虑以下SQL查询:

SELECT tb2.DatasetID, tb2.score1, tb2.score2, tb2.score3, tb2.score4, tb2.score5 
FROM Meta AS tb1 
INNER JOIN Scores AS tb2 ON tb2.DatasetID = tb1.DatasetID 
WHERE tb1.StudyNumber = 217139 
  AND tb1.StudyDescription LIKE '%|55184|%'

带有两组过滤器

  • 过滤器集1:StudyNumber = 217139, StudyDescription ~ 55184 ==>返回1行
  • 过滤器集2:StudyNumber = 277145, StudyDescription ~ 55296 ==>返回2行

直接在SQL Server Management Studio中运行这些查询可为过滤器1提供1行结果,为过滤器2提供2行结果。我对所有三行的结果进行了快速比较,本质上看起来很相似。因此,我排除了数据方面的问题。

现在,通过Python代码执行相同的操作。下面的代码段将处理查询。对于预期结果为1行的过滤器集1来说,它工作正常。

import numpy as np
import pandas as pd
import json
import pyodbc

connStr = 'Driver=%s; Server=%s;Database=%s;UID=%s; PWD=%s' %(...) # Omitted Credentials
conn = pyodbc.connect(connStr)
dbCursor = conn.cursor()

q = "SELECT tb2.DatasetID, tb2.score1, tb2.score2, tb2.score3, tb2.score4, tb2.score5 
FROM Meta as tb1 
INNER JOIN Scores as tb2 
ON tb2.DatasetID=tb1.DatasetID 
WHERE tb1.StudyNumber=?and tb1.StudyDescription like ? "

# ----------------------
# Setting Filters
# ----------------------
# Filter Set 1
study_number= 217139 
study_desc = 55184

# Filter Set 2
# study_number= 277145 
# study_desc = 55296
# ----------------------

param = f'%|{study_desc}|%'
df = pd.read_sql(q, conn, params={study_number, param}, coerce_float=False)
print('Query Completed!')

但是,使用过滤器集2(请参见上文)运行代码,将引发以下我不清楚的错误。我尝试了没有解析度的驱动程序13和17。

在SQL'...'上执行失败:('42000','[42000] [Microsoft] [ODBC [SQL Server驱动程序13] [SQL Server]转换数据类型时出错 从nvarchar到bigint。 (8114)(SQLExecDirectW)')

足够有趣的是,如果我用以下方法替换最后一行中的pd.read_sql,则任何一个过滤器集都不会产生错误。

dbCursor.execute(q, study_number, param)
df = pd.DataFrame(dbCursor.fetchall())

0 个答案:

没有答案