J'utilise SQLAlchemy avec un backend Postgres pour effectuer une insertion ou une mise à jour en masse. Pour essayer d'améliorer les performances, j'essaie de valider uniquement une fois tous les mille lignes environ:Comment effectuer efficacement une insertion ou une mise à jour en masse avec SQLAlchemy?
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()
Cependant, cela ne fonctionne pas. Il semble que lorsque l'INSERT échoue, il laisse les choses dans un état étrange qui empêche le UPDATE de se produire. Recule-t-il automatiquement la transaction? Si oui, cela peut-il être arrêté? Je ne veux pas que toute ma transaction soit annulée en cas de problème, c'est pourquoi j'essaie d'attraper l'exception en premier lieu. Le message d'erreur que je reçois, BTW, est "sqlalchemy.exc.InternalError: (InternalError) transaction en cours est abandonnée, les commandes ignorées jusqu'à la fin du bloc de transaction", et cela se produit sur la mise à jour().) appel.
"Si une erreur survient dans une transaction, elle force l'ensemble de la transaction à être annulée Je considère qu'il s'agit d'un bug de conception Postgres." - N'est-ce pas le point des transactions? De [Wikipedia] (http: //en.wikipedia.org/wiki/Database_transaction): "Les transactions fournissent une proposition" tout ou rien ", indiquant que chaque unité de travail exécutée dans une base de données doit être complète ou n'avoir aucun effet." – spiffytech
@Spiffytech Bonne réponse. Cela m'a vraiment fait LOL. –