[Zope] problem with commits in SQLAlchemyDA

robert rottermann robert at redcor.ch
Mon Aug 17 10:58:07 EDT 2009


Maric Michaud schrieb:
> robert rottermann a écrit :
>  > I do not see any reference to mark_changed
>  > you have to call it before any transaction.commit() to tell the zope 
> transaction
>  > machinery that it has to commit you changes also.
>  > robert
>  >
> 
> In fact, what I understood is that zope.sqlalchemy, by default, bypasses 
> the commit if status is not manually set as 'changed' (see the docstring 
> I quoted in my previous mail). The alternative is to build the 
> SessionExtension with initial_state == STATUS_INVALIDATED.
> 
> My point is that it should be the default for a DA, as it is intended to 
> be used mainly by zsql methods which doesn't do nothing to the 
> transaction state.
> 
> Maybe I wasn't clear but the patch works well with my existing zsql code.
> 
it is a longtime that i worked with zsql methods.
however I think the difference is, that zsql handles transactions itself. it
wraps every zqls method in a start/end transaction. pair.

this is similarly done by zope.sqlalchemy. but it will only commit, when you
tell it that the session is dirty by calling mark_changed

import transaction
from zope.sqlalchemy import mark_changed.
here is how I use it
    def addKtyp(self, form, commit=1):
        """
        create a new ktyp
        return id of that ktyp
        """
        session = self.getSession()
	...

        if values:
	    ...
            if not ktyp:
		...
                session.add(ktyp)
                # only mark the session, do not  yet commit
                self.mark_changed()
                if commit:
                    transaction.commit()
                    # we only know the id after a commit !!!
                    ktyp_id = ktyp.ktypid
        return ktyp_id

robert


More information about the Zope mailing list