"参数类型无效"使用executemany()

时间:2017-02-01 07:13:04

标签: python sql-server numpy pyodbc freetds

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

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)&#34)

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

谢谢。

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:0)

对于那些在外面读书的人来说,这把我逼到了墙上。

我最终的解决方案是将所有变量都转换为'str',并且效果很好。

答案 2 :(得分:0)

我和罗伯特一样;我将所有内容都转换为字符串。就我而言,这是我转换为字符串类型的 Pandas 数据框:

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

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