2017-02-01 4 views
4

я пытаюсь вставить кучу данных в базу данных"Неверный тип параметра" (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)

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

Как я решить эту проблему.

спасибо.

ответ

6

Ваша проблема не связана с объемом данных по себе, это то, что некоторые из ваших кортежей содержат 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: ('Invalid parameter type. 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.

+0

Как я могу это сделать с помощью Pandas DataFrame? Я пробовал df [col] .astype (int) для каждого col, но до сих пор не радует. –

+0

@MattCamp - Я просто попробовал простой тест с помощью 'df.values.tolist()', и он работал для меня. Если вам нужна дополнительная помощь, вы должны [задать новый вопрос] (https://stackoverflow.com/questions/ask). –

+0

Да, я получил его на работу. У меня была проблема, что он не позволял мне передавать данные, потому что в поле не было дубликатов, и тогда, когда я пытался сделать меньше записей, эта ошибка была выше. просто изменили дубликаты записей, чтобы проверить, что это сработало. благодаря –

Смежные вопросы