python - 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|%'
带两组过滤器
- 过滤器集 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 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())
解决方案
推荐阅读
- azure-virtual-machine - Toggle 在 Terraform 中创建 Azure VM
- node.js - Watson 助手 - UNABLE_TO_GET_ISSUER_CERT_LOCALLY
- c# - 没有出现可执行窗口且没有错误的错误
- python - 在 Python tkinter 中上传 excel 文件并打印为数据框
- java - 如何解析这个类似于 JSON 的字符串?
- asp.net - 如何在基于令牌的身份验证 OWIN 中使令牌无效
- visual-studio - 为什么 Visual Studios 不构建新代码?
- azure-data-factory - 在 Azure 数据工厂中解压缩 gzip 文件
- vue.js - vuex:状态字段“foo”被“foo”处的同名模块覆盖
- c# - 将对象插入容器中,其中构造对象的类在类型参数的数量上有所不同