"Invalid parameter type" (numpy.int64) 使用 executemany() 插入行时



我尝试将一堆数据插入数据库

insert_list = [(1,1,1,1,1,1),(2,2,2,2,2,2),(3,3,3,3,3,3),....] #up to 10000 tuples in this list
conn = pyodbc.connect('DRIVER={FreeTDS};SERVER=xxxxx;DATABASE=xxxx;UID=xx;PWD=xx;TDS_Version=7.0')
cursor = conn.cursor()
sql = "insert into ScanEMAxEMAHistoryDay(SecurityNumber, EMA1, EMA2, CrossType, DayCross, IsLocalMinMax) values (?, ?, ?, ?, ?, ?)"
cursor.executemany(sql, insert_list)

cursor.executemany(sql, insert_list)

噗嗤。编程错误: ('参数类型无效。 param-index=4 param-type=numpy.int64', 'HY105')

减少到 100 个元组:

cursor.executemany(sql, insert_list[:100])

cursor.executemany(sql, insert_list[:100])

噗嗤。编程错误: ('参数类型无效。 param-index=4 param-type=numpy.int64', 'HY105') cursor.executemany(sql, insert_list[:100])

减少到 5 个元组:

cursor.executemany(sql, insert_list[:5])
conn.commit()

这可以插入到数据库

我尝试:

sql = 'SET GLOBAL max_allowed_packet=50*1024*1024'
cursor.execute(sql)

在 excutemany() 之前,但它有一个错误:

噗嗤。编程错误: ('42000', "[42000] [FreeTDS][SQL Server]'GLOBAL' 不是可识别的 SET 选项。(195) (SQLExecDirectW)")

我是如何解决这个问题的。

谢谢。

您的问题不在于数据量本身,而在于某些元组包含numpy.int64值,这些值不能直接用作 SQL 语句的参数值。例如

a = numpy.array([10, 11, 12], dtype=numpy.int64)
params = (1, 1, a[1], 1, 1, 1)
crsr.execute(sql, params)

会扔

编程错误: ('参数类型无效。 param-index=2 param-type=numpy.int64', 'HY105')

因为第三个参数值是 numpy 数组a中的numpy.int64元素。使用 int() 转换该值将避免此问题:

a = numpy.array([10, 11, 12], dtype=numpy.int64)
params = (1, 1, int(a[1]), 1, 1, 1)
crsr.execute(sql, params)

顺便说一下,原因

sql = 'SET GLOBAL max_allowed_packet=50*1024*1024'
cursor.execute(sql)

不起作用的是max_allowed_packet是一个MySQL设置,对Microsoft SQL Server没有任何意义。

我和罗伯特做了同样的事情;我将所有内容转换为字符串。就我而言,它是一个熊猫数据框,我将其转换为字符串类型:

data = pandas.read_json(...)
data.astype(str).to_sql(...)

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.astype.html

如果您要检索的数据包含 URL,您可能会收到"未知协议"错误(或类似错误)。如果在强制转换为字符串类型后仍收到此错误,请尝试改用StringIO

import requests
from io import StringIO
...
data = pandas.read_json(StringIO(response.text))

其中responserequests库中对象Response的实例,其属性text包含 JSON 文本数据。

对于任何读到这篇文章的人来说,它都把我逼上了墙。

我的最终解决方案是将所有变量转换为"str",它工作正常。

使用 pyodbc 将参数传递到 SQL INSERT 语句时,我遇到了同样的错误。正如罗伯特所提到的,只需将变量转换为字符串即可。

例:语法 - str()

cursor.execute("INSERT INTO Table ([col1],[col2],[col3]...])VALUES(?,'test',?)", str(value1), str(value3))

相关内容

  • 没有找到相关文章

最新更新