使用 executemany() 插入行时出现“无效参数类型”(numpy.int64)

新手上路,请多包涵

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

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)

pyodbc.ProgrammingError: (‘无效的参数类型。param-index=4 param-type=numpy.int64’, ‘HY105’)

减少到 100 个元组:

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

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

pyodbc.ProgrammingError: (‘无效参数类型。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() 之前,但它有一个错误:

pyodbc.ProgrammingError: (‘42000’, “[42000] [FreeTDS][SQL Server]‘GLOBAL’ 不是可识别的 SET 选项。(195) (SQLExecDirectW)”)

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

谢谢你。

原文由 YONG BAGJNS 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

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

会扔

ProgrammingError: (‘无效的参数类型。param-index=2 param-type=numpy.int64’, ‘HY105’)

因为第三个参数值是 numpy.int64 numpy 数组中的元素 a 。使用 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 没有任何意义。

原文由 Gord Thompson 发布,翻译遵循 CC BY-SA 3.0 许可协议

我和罗伯特一样;我将所有内容都转换为字符串。在我的例子中,它是我转换为字符串类型的 pandas 数据框:

 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))

where response is an instance of object Response from the requests library and its attribute text contains the json text data.

原文由 Marcos 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题