【发布时间】:2019-04-10 13:34:54
【问题描述】:
我正在尝试从 REST API 中提取数据并将其插入 SQL Server。如果我们让脚本一起执行 PhotoBinary,Filetype 它可以工作,但是一旦我添加了整数 ID,我们就会得到下面的错误。另外,如果我让它自己从 API 中提取 ID,它就可以工作。
我正在尝试提取 3 条信息
- EmployeeID 是一个整数。
- 图像的二进制字符串表示
- 原始文件的文件类型例如:.jpg
目标表设置为:
Create table Employee_Photo
(
EmployeeID int,
PhotoBinary varchar(max),
FileType varchar(10)
)
我得到的错误是:
Traceback (most recent call last):
File "apiphotopullwithid.py", line 64, in <module>
cursor.execute("INSERT INTO dbo.Employee_Photo([EmployeeID],[PhotoBinary],[FileType]) values (?,?,?)", row['EMPID'],row['Photo'],row['PhotoType'])
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 5 (""): The supplied value is not a valid instance of data type float. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision. (8023) (SQLExecDirectW)')
import json
import pandas as pd
import sqlalchemy
import pyodbc
import requests
url = "https://someurl.com/api/PersonPhoto"
headers = {
'Accept': "application/json",
'Authorization': "apikey XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
'Content-Type': "application/json",
'cache-control': "no-cache"
}
response = requests.request("GET", url, headers=headers)
data = json.loads(response.text)
ID,Photo,PhotoType = [],[],[]
for device in data['PersonPhoto']:
ID.append(device[u'ID'])
Photo.append(device[u'Photo'])
PhotoType.append(device[u'PhotoType'])
df = pd.DataFrame([ID,Photo,PhotoType]).T
df.columns = ['EMPID','Photo','PhotoType']
df = df.astype({'EMPID':'Int64'})
connStr = pyodbc.connect(
"DRIVER={SQL Server};"
"SERVER=SQLTest;"
"Database=Intranet123;"
"Trusted_Connection=yes;"
#"UID=ConnectME;"
#"PWD={Password1}"
)
cursor = connStr.cursor()
for index,row in df.iterrows():
cursor.execute("INSERT INTO dbo.Employee_Photo([EmployeeID],[PhotoBinary],[FileType]) values (?,?,?)", row['EMPID'],row['Photo'],row['PhotoType'])
connStr.commit()
cursor.close()
connStr.close()
【问题讨论】:
-
我确实做到了。如果我自己为 3 列中的任何一个运行脚本,则该过程有效。问题似乎是当它们组合时我得到了错误。当第二列和第三列为空时,这似乎是 Pandas 对数据所做的事情。它似乎将 Int 转换为 Float。
-
你能修改python程序,使错误以独立的方式重现吗? EG 删除 API 调用并插入文字值。
-
我已经尝试将 api 的响应输出到屏幕上,它显示正确,即作为 int 而不是 float。看来PANDAS部分正在进行转换。
标签: python sql-server pandas