The SQLite database is pregenerated for a release and contains only
reference information. It's read only to the web application. So I'm
wondering if it's worth even hooking the session into the transaction
manager at all. I have a request subclass, and to open a session I use
a reified method:
@reify
def sa_session(self):
engine = self.registry.sa_engine # Attribute set during startup
configuration.
info = {"request": self} # Because this was in the tutorial.
sess = sqlalchemy.orm.Session(engine, info=info)
zope.sqlalchemy.register(sess) # Is this worth doing for a
read-only database?
return sess
The transaction manager closes the session for me, so without it I
guess I'd have to have a subscriber that rolls back and closes the
request. I don't want to have to do it in every view because it's not
view-specific logic.
On Tue, Aug 16, 2022 at 9:19 AM 'Jonathan Vanasco' via pylons-discuss
<[email protected]> wrote:
>
> On Tuesday, August 16, 2022 at 11:45:24 AM UTC-4 Mike Orr wrote:
> > It is rolling back in some of my testing when there's no
> > insert/delete/update, but I want to make sure it always does, just in
> > case something somehow modifies the database when we didn't intend to.
> > It's not that big a deal but it's what I'd like. I'm not sure if
> > SQLAlchemy is issuing rollback if there were no changes, or if it will
> > always do so.
>
> That's from SQLAlchemy. It will rollback if there were no database writes.
> SQLAlchemy is unaware of raw sql being a write operation, so you need to use
> the `mark_changed` function from zope.sqlalchemy. This is a weird
> idiosyncrasy of SQLAlchemy and transaction - the transaction could be
> completely successful, but SQLAlchemy will rollback because there was no
> activity within it's scope.
>
> It sounds like you're trying to do the opposite of what the `transaction`
> package is designed to do.
>
> The way I normally deal with situations like that is to control if SQLAlchemy
> joins the transaction or not. In most projects, I only use the transaction
> on specific views that require this type of integration - such as anything
> that sends an email (pyramid_mailer integrates with pyramid_tm).
>
> It also sounds like your concern is mostly in testing. The approach I've
> started to standardize on is to have a database snapshot for tests and just
> recreate the database from that on every run. If you just want to completely
> disable database commits though, you could have your test harness set up a
> SQLAlchemy event listener for "commit", and then issue a "rollback" within
> the event.
>
> --
> You received this message because you are subscribed to the Google Groups
> "pylons-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pylons-discuss/771e180a-ca5b-4625-baf7-972d237ea45an%40googlegroups.com.
--
Mike Orr <[email protected]>
--
You received this message because you are subscribed to the Google Groups
"pylons-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/pylons-discuss/CAH9f%3Duq9HZVsyVJir4QzG0v8AXs-MURjxNAZ6uqH2LPkdiEW1A%40mail.gmail.com.