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

2024-04-19 03:13:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着把一堆数据插入数据库

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: ('Invalid parameter type. param-index=4 param-type=numpy.int64', 'HY105')

减少到100个元组:

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

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

pyodbc.ProgrammingError: ('Invalid parameter type. 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' is not a recognized SET option. (195) (SQLExecDirectW)")

我是怎么解决的。

谢谢你。


Tags: 数据库sqlparameterparamtypeconncursorlist
1条回答
网友
1楼 · 发布于 2024-04-19 03:13:02

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

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

将抛出

ProgrammingError: ('Invalid parameter type. param-index=2 param-type=numpy.int64', 'HY105')

因为第三个参数值是来自numpy数组anumpy.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没有任何意义。

相关问题 更多 >