使用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)”)

我如何解决这个问题。

谢谢。


问题答案:

您的问题不在于数据 量本身 ,而是某些元组包含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.int64numpy数组中的元素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没有任何意义。