Быстрое обновление таблицы MySQL на основе массива NumPy

#python #mysql #numpy #sql-update #mysql-python

Вопрос:

Доброе утро, все желающие,

Я надеюсь, что у вас все хорошо и что вы с нетерпением ждете отличных выходных!

У меня есть массив 2D numpy, содержащий 2 cols и приблизительно 6000 строк [col1 = имя = идентификатор для предложения where ; col2 = значение для столбца val]: x = np.array([['a', '2'], ['b', '2'] , ['c', '1']])

 [['a' '2']
 ['b' '2']
 ['c' '1']]
 

Теперь мне нужно записать эти значения в качестве обновления в таблицу Mysql. В настоящее время я использую цикл for, проходящий через массив и создающий sql-запросы для каждой записи
Update [test_table] SET value = 'val' WHERE Name = 'name'
что может быть приемлемо для небольших объемов данных, но ужасно медленно для наборов данных Хью.

Есть ли в любом случае способ ускорить это или в идеале напрямую использовать массив numpy для обновления?

Ответ №1:

Это то, что executemany нужно:

 cur.executemany( "UPDATE test_table SET value=? WHERE Name=?", x )
 

Теперь это предполагает, что «значение» — первое, а «имя» — второе. Возможно, вам потребуется изменить порядок столбцов массива, чтобы это сработало.

Комментарии:

1. Большое вам спасибо за подсказку использовать executemany. Похоже, это именно то, что я искал! У меня только одна «маленькая» проблема: при попытке вызвать его, используя ваше предложение, появляется сообщение об ошибке»Не удалось обработать формат-параметры; Python» str_ «не может быть преобразован в тип MySQL «»Входной массив имеет форму 0:» 0 «и 1: «test123» Обновление: исправление ошибки записи

2. Проблема решена У меня возникла проблема с преобразованием моего массива в форму tupple. Я использовал кортеж([кортеж(строка) для строки в VSA]) вместо VSA = кортеж([кортеж([int(строка[0]), str(строка[1])]) для строки в VSA])