РБ
Size: a a a
РБ
РБ
I
АП
ВГ
MB
from my_app import db_session
def do_work():
db_session.add(MyModel(…))
db_session.commit()
is Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (psycopg2.errors.InFailedSqlTransaction) current transaction is aborted, commands ignored until end of transaction blockМне надо сделать так, чтобы если бы в одном из потоков случилась бы такая ошибка, то это потом как-то эта сессия смогла бы автоматически сделать rollback и уже другие потоки бекграундных задач смогли бы продолжить работу.
my_app import db_sessionэто делать не хочется, так как таких методов очень много. Хочется как-то глобально растроить так, чтобы в случае ошибки в БД, сессия смогла бы сделать rollback.
def do_work():
try:
db_session.add(MyModel(…))
db_session.commit()
except SQLAlchemyError:
db_session.rollback()
Но
T
from my_app import db_session
def do_work():
db_session.add(MyModel(…))
db_session.commit()
is Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (psycopg2.errors.InFailedSqlTransaction) current transaction is aborted, commands ignored until end of transaction blockМне надо сделать так, чтобы если бы в одном из потоков случилась бы такая ошибка, то это потом как-то эта сессия смогла бы автоматически сделать rollback и уже другие потоки бекграундных задач смогли бы продолжить работу.
my_app import db_sessionэто делать не хочется, так как таких методов очень много. Хочется как-то глобально растроить так, чтобы в случае ошибки в БД, сессия смогла бы сделать rollback.
def do_work():
try:
db_session.add(MyModel(…))
db_session.commit()
except SQLAlchemyError:
db_session.rollback()
Но
T
T
T
AM
T
MB
MB
@contextmanager
def get_session():
session = get_the_session_one_way_or_another()
try:
yield session
except:
session.rollback()
raise
else:
session.commit()
th get_session() as session:но это все увеличивает кол-во кода. В джанге можно без этого контекстного менеджера. Как-то они ж сделали так, что можно не париться по поводу psycopg2.errors.InFailedSqlTransaction
# do something with the session
,
T
T
T
MB
MB
MB