¿Cómo hago de forma eficiente una inserción o actualización masiva con SQLAlchemy?
Estoy usando SQLAlchemy con un backend de Postgres para hacer una inserción o actualización masiva. Para intentar mejorar el rendimiento, estoy intentando comprometer solo una vez cada mil filas:
trans = engine.begin()
for i, rec in enumerate(records):
if i % 1000 == 0:
trans.commit()
trans = engine.begin()
try:
inserter.execute(...)
except sa.exceptions.SQLError:
my_table.update(...).execute()
trans.commit()
Sin embargo, esto no está funcionando. Parece que cuando falla INSERT, deja las cosas en un estado extraño que evita que se produzca la ACTUALIZACIÓN. ¿Se está revirtiendo automáticamente la transacción? Si es así, ¿se puede detener esto? No quiero que toda mi transacción se revierta en caso de un problema, por lo que, en primer lugar, trato de detectar la excepción.
El mensaje de error que recibo, por cierto, es "sqlalchemy.exc.InternalError: (InternalError) la transacción actual se cancela, los comandos se ignoran hasta el final del bloque de transacción", y sucede en la llamada update (). Execute ().