Re: [dabo-users] Complexity and avoiding the 1:1:1 syndrome

Author: Ed Leafe

Posted: 2008-02-16 at 22:07:16

On Feb 16, 2008, at 4:44 PM, Michael Hipp wrote:

> The problem with a lot of frameworks is that they have wonderful

> save()

> and load() methods and such. But as soon as save() needs to work on

> multiple tables (or even multiple records at one time within one

> table)

> then all of a sudden the built-in helpers are no help and you're

> back to

> writing fully custom SQL and managing transactions and such as if

> there

> was no framework at all.

That is never the case here. As I mentioned in another post, multiple-

related tables are no problem; calling the main bizobj's save()

percolates through the relationships, and a problem at any level will

rollback the entire transaction.

With unrelated bizobjs, you will have to do some of the coding

yourself, since there is no way for a framework to guess what is

supposed to happen. But let's say that you have two sets of unrelated

bizobjs that you want saved within a single transaction. The best way

to do something like this is to make sure that the PrimaryBizobj of

the form has a reference to the other group's "main" bizobj (i.e., the

highest-level parent). So in the setup code in the form:

bluebiz = self.addBizobj(BlueBiz)

redbiz = self.addBizobj(RedBiz)

bluebiz.redbiz = redbiz

In the above, 'bluebiz' is the form's PrimaryBizobj (since it was

added first), and it has a reference to the red bizobj. Now if you

want to save both the blue and red families of bizobjs within a single

transaction, you would have write something like this in the blue

bizobj:

def save(self, startTransaction=True):

isTransactionManager = False

if startTransaction:

isTransactionManager = self._getTransactionToken()

if isTransactionManager:

self._CurrentCursor.beginTransaction()

try:

super(ThisBizobjClass, self).save(startTransaction=False)

except (dException.DBQueryException, dException.dException), e:

self._CurrentCursor.rollbackTransaction()

self._releaseTransactionToken()

# Pass the exception to the UI

raise dException.dException, e

> Knowing that lots of my stuff is just like this, will I be glad I'm in

> Dabo or will it seem like I'm just back to making calls to psycopg2 on

> my own?

You should never have to talk to the database directly in your code.

If you do, it's either because of a poor design in your code, or a bug

in Dabo.

-- Ed Leafe

©2008 Ed Leafe