首页 > 解决方案 > Pandas read_sql:转换数据类型时出错

问题描述

我有一个相对简单的任务是查询 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|%'

带两组过滤器

直接在 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 Driver 13 for SQL Server][SQL Server]将数据类型 nvarchar 转换为 bigint 时出错。(8114) (SQLExecDirectW)')

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

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

标签: pythonsql-serverpandas

解决方案


推荐阅读