SQLAlchemy автокоммит? - PullRequest
       19

SQLAlchemy автокоммит?

1 голос
/ 12 марта 2010

У меня проблема с фиксацией SQLAlchemy. Грубый набросок моего кода:

trans = self.conn.begin()
try:            
    assert not self.conn.execute(my_obj.__table__.select(my_obj.id == id)).first()
    self.conn.execute(my_obj.__table__.insert().values(id=id))
    assert not self.conn.execute(my_obj.__table__.select(my_obj.id == id)).first()
except:
    trans.rollback()
    raise

Я не фиксирую, а второе утверждение всегда терпит неудачу! Другими словами, кажется, что данные вставляются в базу данных, даже если код находится внутри транзакции! Является ли эта оценка точной?

1 Ответ

1 голос
/ 12 марта 2010

Вы правы в том, что изменения не передаются в БД. Но они автоматически сбрасываются SQLAlchemy, когда вы выполняете запрос, в вашем случае сброс выполняется в строках с утверждениями. Поэтому, если вы не будете явно вызывать commit, вы никогда не увидите эти изменения в БД в реальных данных. Однако вы получите их обратно, если будете использовать один и тот же объект conn.

Вы можете передать autoflush=False в конструктор сеанса, отключите это поведение.

...