PyMySQL разные обновления в одном запросе?

Поэтому у меня есть скрипт python, который проходит примерно через 350 000 объектов данных, и в зависимости от некоторых тестов ему необходимо обновить строку, которая представляет каждый из этих объектов в MySql db. Я также использую pymysql, поскольку у меня были проблемы с ним, особенно при отправке больших запросов (выберите операторы с предложением where column IN (....) , которое может содержать 100 000+ значений).

Поскольку каждое обновление для каждой строки может отличаться, каждый оператор обновления отличается. Например, для одной строки мы можем обновить first_name но для другой строки мы хотим оставить first_name нетронутым, и мы хотим обновить last_name .

Вот почему я не хочу использовать метод cursor.executemany() который принимает один общий оператор обновления, а затем передал его значениям, но, как я уже упоминал, каждое обновление отличается, поэтому наличие одного родового оператора обновления на самом деле не является работа для моего дела. Я также не хочу отправлять более 350 000 инструкций обновления по отдельности. В любом случае я могу объединить все мои операторы обновления и отправить их сразу?

Я попытался использовать их все в одном запросе и использовать метод cursor.execute() но он, похоже, не обновляет все строки.

  • Как запустить код инициализации перед тестированием при использовании модуля Unittest Python в качестве тестировщика?
  • Ошибка сегментации в PyArray_SimpleNewFromData
  • запуск pyinstaller после того, как Anaconda установит результаты в ImportError: нет модуля с именем pefile,
  • Графический график Matplotlib от значений в pandas DataFrame
  • Force repr () использовать одинарные кавычки
  • Python: получение наиболее частого элемента в списке
  • Преобразование django ValuesQuerySet в объект json
  • печать трассировки стека python без исключения
  • 2 Solutions collect form web for “PyMySQL разные обновления в одном запросе?”

    SQL # 1: CREATE TABLE t с любыми столбцами, которые могут потребоваться изменить. Сделайте все из них NULL (в отличие от NOT NULL ).

    SQL # 2: выполните объем INSERT (или LOAD DATA ) всех необходимых изменений. Например, если изменить только first_name , заполните id и first_name , но у других столбцов NULL .

    SQL # 3-14:

     UPDATE real_table JOIN t ON t.id = real_table.id SET real_table.first_name = t.first_name WHERE t.first_name IS NOT NULL; # ditto for each other column. 

    Все SQL, за исключением # 1, потребуют много времени. И поскольку UPDATE необходимо создать журнал отмены, он может быть тайм-аут или иначе быть проблематичным. При необходимости ознакомьтесь с обсуждением фрагментации .

    При необходимости используйте такие функции, как COALESCE() , GREATEST() , IFNULL() и т. Д.

    Массовые UPDATEs обычно подразумевают плохой дизайн схемы.

    (Если Райан прыгает с «Ответ» вместо «комментария», он должен, вероятно, получить «щедрость».)

    Ваша лучшая производительность будет, если вы можете закодировать свои «тесты» в самой логике SQL, так что вы можете свернуть все до нескольких операторов UPDATE. Или, по крайней мере, получить как можно больше так, чтобы меньшее количество строк нужно было обновлять индивидуально.

    Например:

     UPDATE tablename set firstname = [some logic] WHERE [logic that identifies which rows need the firstname updated]; 

    Вы не много описываете свои тесты, поэтому трудно быть уверенным. Но вы можете получить довольно много логики в своем предложении WHERE с небольшим количеством работы.

    Другим вариантом было бы превратить вашу логику в хранимую процедуру. Вы по-прежнему будете делать 350 000 обновлений, но, по крайней мере, они не все «идут по проводам». Я бы использовал это только как последнее средство; бизнес-логика должна храниться на прикладном уровне, когда это возможно, а хранимые процедуры делают ваше приложение менее портативным.

    Python - лучший язык программирования в мире.