Есть ли способ явно помечать объект как clean в ORM SQLAlchemy?Маркировка объекта как чистого в SQLAlchemy ORM
Отчасти это связано с предыдущим вопросом на bulk update strategies.
Я хочу, чтобы в течение before_flush
прослушиватель событий отмечал кучу объекта, поскольку на самом деле его не нужно было смывать. Это связано с тем, что они вручную синхронизируются с базой данных другими способами.
Я пробовал стратегию ниже, но это приводит к удалению объекта из сеанса, что впоследствии может вызвать проблемы позже, когда происходит ленивая загрузка.
@event.listens_for(SignallingSession, 'before_flush')
def before_flush(session, flush_context, instances):
ledgers = []
if session.dirty:
for elem in session.dirty:
if (session.is_modified(elem, include_collections=False)):
if isinstance(elem, Wallet):
session.expunge(elem) # causes problems later
ledgers.append(Ledger(id=elem.id, amount=elem.balance))
if ledgers:
session.bulk_save_objects(ledgers)
session.execute('UPDATE wallet w JOIN ledger l on w.id = l.id SET w.balance = l.amount')
session.execute('TRUNCATE ledger')
Я хочу сделать что-то вроде:
session.dirty.remove(MyObject)
Но это не работает, как session.dirty
является вычисляемым свойство, а не обычный атрибут. Я копал код инструментария, но не вижу, как я могу обмануть список dirty
, чтобы он не содержал что-то. Я вижу, есть также history
о состоянии объекта, о котором нужно будет заботиться также.
Любые идеи? Базовая база данных - это MySQL, если это имеет значение.
Матф
Увы, не совсем то, что делать Я хочу, чтобы это делалось, как будто 'кошелек' уже находится в' session.dirty' в силу того, что, если ему присвоено новое значение, я хочу * удалить * его из грязного списка. Если я использую 'set_committed_value()', то он изменяет значение, но объект остается в грязном списке. –
@MattHamilton Он остается в грязном списке, но 'is_modified' вернет' False'. – univerio
Ahhh правильно, спасибо! Поэтому, пока он кажется грязным, флеш на самом деле не имеет работы. Немного больше, чтобы перекопать этот метод, и то, что у меня получилось, это: 'instance_state (obj) .committed_state.clear()', чтобы очистить состояние объекта –