PyMySQL diferentes actualizaciones en una consulta?

Así que tengo un script de Python que pasa por aproximadamente 350,000 objetos de datos y, según algunas pruebas, necesita actualizar una fila que represente cada uno de esos objetos en una base de datos de MySQl. También estoy usando pymysql, ya que he tenido menos problemas, especialmente al enviar consultas de selección grandes (sentencias de selección con la where column IN (....) cláusula where column IN (....) puede contener más de 100,000 valores).

Como cada actualización para cada fila puede ser diferente, cada instrucción de actualización es diferente. Por ejemplo, para una fila podríamos actualizar el primer nombre, pero para otra fila dejar el primer nombre sin tocar y queremos actualizar el last_name .

Esta es la razón por la que no quiero usar el método cursor.executemany() que toma una statement de actualización genérica y luego la alimenta con los valores, sin embargo, como mencioné, cada actualización es diferente, por lo que tener una statement de actualización genérica realmente no trabajar para mi caso Tampoco quiero enviar más de 350,000 instrucciones de actualización por cable. ¿Hay alguna forma de poder empaquetar todas mis declaraciones de actualización juntas y enviarlas de una vez?

Intenté tenerlos todos en una consulta y usando el método cursor.execute() pero no parece actualizar todas las filas.

SQL # 1: CREATE TABLE t con las columnas que necesite cambiar. Haz que todos sean NULL (a diferencia de NOT NULL ).

SQL # 2: realice un INSERT (o LOAD DATA ) a granel de todos los cambios necesarios. Por ejemplo, si solo cambia el primer nombre, complete el id y el primer nombre, pero tenga las otras columnas 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. 

Todos los SQL, excepto el # 1, consumirán mucho tiempo. Y, dado que UPDATE necesita crear un registro de deshacer, podría agotarse o podría ser problemático. Vea una discusión de fragmentación si es necesario.

Si es necesario, utilice funciones como COALESCE() , GREATEST() , IFNULL() , etc.

Las UPDATEs masa generalmente implican un diseño de esquema deficiente.

(Si Ryan interviene con una ‘Respuesta’ en lugar de solo un ‘Comentario’, probablemente debería obtener la ‘recompensa’).

Su mejor desempeño será si puede codificar sus “pruebas” en la lógica SQL en sí misma, de modo que pueda resumir todo en un puñado de declaraciones UPDATE. O, al menos, haga tantas como sea posible de esa manera, de modo que sea necesario actualizar menos filas individualmente.

Por ejemplo:

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

No describe mucho acerca de sus exámenes, por lo que es difícil estar seguro. Pero normalmente puede incluir bastante lógica en su cláusula WHERE con un poco de trabajo.

Otra opción sería poner su lógica en un procedimiento almacenado. Seguirás haciendo 350,000 actualizaciones, pero al menos no todas están “pasando por alto”. Sin embargo, solo usaría esto como último recurso; la lógica de negocios debe mantenerse en la capa de aplicación siempre que sea posible, y los procedimientos almacenados hacen que su aplicación sea menos portátil.