Wstawiam kilka rekordów 10k do bazy danych z regułami integralności REF. Niektóre wiersze danych są niestety duplikowane (ponieważ już istnieją w bazie danych). Byłoby zbyt drogie, aby sprawdzić istnienie każdego wiersza w bazie danych przed jego wstawieniem, dlatego zamierzam kontynuować obsługę wyjątków IntegrityError, które zostały zgłoszone przez SQLAlchemy, rejestrowanie błędu i kontynuowanie.SQLAlchemy IntegrityError i hurtowy import danych
Mój kod będzie wyglądał mniej więcej tak:
# establish connection to db etc.
tbl = obtain_binding_to_sqlalchemy_orm()
datarows = load_rows_to_import()
try:
conn.execute(tbl.insert(), datarows)
except IntegrityError as ie:
# eat error and keep going
except Exception as e:
# do something else
The (implicite) założenie Robię powyżej jest to, że SQLAlchemy nie toczy się wiele wkładek w ramach jednej transakcji. Jeśli moje założenie jest błędne, oznacza to, że jeśli wystąpi błąd IntegrityError, reszta wstawki zostanie przerwana. Czy ktokolwiek może potwierdzić, że powyższy "wzorzec" pseudokodu działa zgodnie z oczekiwaniami - czy stracę dane w wyniku odrzucenia wyjątków IntegrityError?
Ponadto, jeśli ktoś ma lepszy pomysł na zrobienie tego, będę zainteresowany, aby to usłyszeć.