[DB-SIG] Oracle tables encapsulation

Stuart 'Zen' Bishop zen@cs.rmit.edu.au
Fri, 3 Dec 1999 11:14:15 +1100 (EST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-1538048050-944180055=:2058
Content-Type: TEXT/PLAIN; charset=US-ASCII

On Thu, 2 Dec 1999, Olivier BERGER wrote:

> Have you experienced this kind of framework, and can you direct me to the
> corresponding source code (if available) so that I won't code it myself
> (with all the resulting errors... ;)

I've attached some code I've been playing with. You can create a 'Table' 
object, passing a list of columns that you want to use to restrict your
search. The table is then encapsulated in a (possibly nested) dictionary 
interface allowing you to retrieve individual rows or tuples of rows through
generating the relevant SQL on the fly (and storing the cursors for reuse).
It allows you to plug in your own UserDict subclass to return for individual
rows.

Its currently Oracle specific, since there is no generic method of
binding parameters that I know of making it rather difficult to write
cross platform database stuff using Python at the moment.

    con = Connect(blah)
    t = zdb.Table(con,'%s.users' % tsgdb.schema,'uname')
    print "USERS table has %d tuples." % len(t)

    print t['zen'].items()

    for k in ('zen','fred','31337'):
        if t.has_key(k):
            print "USERS has tuple with key '%s'" % k
        else:
            print "USERS has NO tuple with key '%s'" % k

    print t.get('zen')


    t = zdb.table.Table(con,'%s.insubject' \
        % tsgdb.schema,('uname','subject','course','year','semstart'))

    print t['adick'].keys()
    print t['adick']['CS577'].items()
    print t['adick']['CS577'].keys()
    print t['adick']['CS577'].values()

    t = zdb.table.Table(con,'ALL_USERS','username')
    print t.keys()
    print t['ACC']


-- 
 ___
   //     Zen (alias Stuart Bishop)     Work: zen@cs.rmit.edu.au
  // E N  Senior Systems Alchemist      Play: zen@shangri-la.dropbear.id.au
 //__     Computer Science, RMIT 	 WWW: http://www.cs.rmit.edu.au/~zen

---559023410-1538048050-944180055=:2058
Content-Type: APPLICATION/octet-stream; name="zdb.tar.gz"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.4.10.9912031114150.2058@goanna.cs.rmit.edu.au>
Content-Description: 
Content-Disposition: attachment; filename="zdb.tar.gz"

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
AHwAAA==
---559023410-1538048050-944180055=:2058--