Thank you, the event worked like a charm :-) Though I think that I don't
need the commit events, because the application terminates anyway.
I modified your approach to gather which objects were flushed so that in
the end I can give the user more precise information:
dbsession.info["new"] = set()
dbsession.info["dirty"] = set()
dbsession.info["deleted"] = set()
def update_session_info(session):
new = session.info["new"]
new |= set(session.new)
dirty = session.info["dirty"]
dirty |= set(session.dirty)
deleted = session.info["deleted"]
deleted |= set(session.deleted)
return new, dirty, deleted
@event.listens_for(dbsession, "before_flush")
def on_before_flush(session, _, _):
update_session_info(session)
...
code.interact(local=locals())
...
new, dirty, deleted = update_session_info(dbsession)
if new or dirty or deleted:
if new:
print("The following objects were created: ", new)
if dirty:
print("The following objects were modified: ", dirty)
if deleted:
print("The following objects were deleted: ", deleted)
yesno = input("Would you like to commit this transaction? [y/N]
")
if yesno == "y":
print("Committing transaction...")
else:
print("Rolling back transaction...")
raise _SessionRollbackException()
# ...this is where the context closes and the transaction commits
and the dbsession ends.
Cheers,
Jens
On Saturday, November 18, 2017 at 12:03:05 AM UTC+10, Simon King wrote:
>
> OK, I think tracking session events seems reasonable. You could do
> something like this (completely untested):
>
> from sqalchemy.event import event
>
> @event.listens_for(YourSessionOrSessionMaker, 'before_flush')
> def on_before_flush(session, flush_context, instances):
> session.info['flushed'] = True
>
>
> # You'd probably also want to reset the 'flushed' flag
> # after a commit or rollback
> @event.listens_for(YourSessionOrSessionMaker, 'after_commit')
> @event.listens_for(YourSessionOrSessionMaker, 'after_rollback')
> def on_session_reset(session):
> session.info['flushed'] = False
>
>
> # when user exits interactive session:
> modified = (
> session.info.get('flushed', False)
> or session.deleted
> or session.new
> or session.dirty
> )
> if modified:
> raw_input('do you want to commit?')
>
>
> ...but note that if you ever execute raw SQL (ie.
> session.execute('UPDATE x WHERE y')), that will not be noticed by
> those events.
>
> Hope that helps,
>
> Simon
>
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.