LINUX.ORG.RU

sqlalchemy, как узнать не пуста ли транзакция

 ,


0

1

Я храню данные приложения в базе (sqlite3) и пытаюсь использовать транзакции для сохранения. То есть при старте приложения начинается транзакция, которая завершается, когда пользователь выбирает «Сохранить»; тут же начинается новая. Фактически, за меня это делает sqlalchemy, я просто вызываю session.commit() .

При закрытии приложения я хочу знать, не изменил ли пользователь чего, чтобы предложить ему сохранить изменения. Из того, что я нашёл в документации, мне могла бы подойти проверка Session.dirty, Session.new и Session.deleted на непустоту, но они опустошаются при вызове flush (а отключать autoflush не кажется хорошей идеей).

Как узнать, были ли после начала транзакции запросы к базе данных?

★★★★★

AFAIK никак, в этом и смысл flush, что сессия забывает про свое состояние.

baverman ★★★
()

А чем плохо вместо

session.commit()
использовать (примерно):
session.autoflush = False
....
if session.dirty:
    print "Doo u saev da stuff?"
    if yes:
        session.flush()
        session.commit()
, и получив соответствующие (нужные тебе) плюшки? Или дописать флаш - не по пацански?

GateKeeper ★★
()
Ответ на: комментарий от GateKeeper

использовать (примерно):

Без flush() или commit() не отработает корректно session.delete(...). То есть после удаления мне всё равно придётся flush() вызывать, ибо без этого объекты остаются в сессии.

Или дописать флаш - не по пацански?

flush() и так будет вызван внутри commit() (по крайней мере, так в доках написано)

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Еще раз: автофлаш убираешь, вызваешь явно. Зато получаешь возможность проверить dirty. Дописать одну строчку - явно не тот оверхед, ради которого надо страдать.

GateKeeper ★★
()
Ответ на: комментарий от GateKeeper

Еще раз: автофлаш убираешь, вызваешь явно. Зато получаешь возможность проверить dirty.

.dirty в сессии sqlalchemy это не флаг, который показывает, что сессия грязная. Это список грязных объектов. Кроме него есть отдельные списки новых объектов и объектов, помеченных к удалению. (Удалённые объекты не попадают в список грязных.) Ну так вот, я удаляю объект из сессии (пользователь захотел). Затем я делаю flush(), чтобы он больше не появлялся в сессии и не смущал своим призраком. После этого все списки, .dirty, .new, .deleted пусты. А изменения есть.

Если не делать flush(), удалённые объекты всплывают в результатах запросов. Вообще-то мне и нужен параметр/метод/как-его-там у сессии, который показывает, что она грязная. Оказалось, что Session.dirty — это не то.

Дописать одну строчку - явно не тот оверхед, ради которого надо страдать.

Да хоть сотню.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Ну, как вариант: проверять mymodelobjectinstance in session.dirty.deleted, хотя да, получается, костыльно сильно.

Посмотри, наверное, в кишках expunge_all() (или clear()). Ну или flush() тот же. Что оно там смотрит, как вычисляет, что осталось несброшенным. Как вариант - использовать Internals API

GateKeeper ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.