You are my hero. If you ever make your way down to Oklahoma I'll take
you out for a steak dinner or something.

On Nov 8, 8:46 am, mdipierro <mdipie...@cs.depaul.edu> wrote:
> Denese. You did a fanstatic job. This was needed for some time.
>
> On Nov 8, 7:38 am, DenesL <denes1...@yahoo.ca> wrote:
>
> > A) What are they?
>
> > Keyed tables are usually legacy tables that don't follow the
> > traditional hidden 'id' field construct of web2py tables.
> > Instead they define one or more fields as primary key.
> > Currently web2py supports keyed tables on DB2, MS SQL, Ingres (thanks
> > Chris Clark) and Informix (after pending patch, thanks Hans Murx).
> > To add support for other DB engines see at the bottom of this info.
>
> > B) How do you create keyed tables?
>
> > Using the same define_table as before but with one difference, the
> > table has a 'primarykey' attribute.
>
> > db.define_table('kperson',
> >     Field('name','string'),
> >     primarykey=['name'],
> >     migrate=False # for legacy tables
> > )
>
> > db.define_table('kdog',
> >     Field('name','string'),
> >     Field('owner','reference kperson.name'),
> >     primarykey=['name'],
> >     migrate=False # for legacy tables
> > )
>
> > Notes:
> > 1) primarykey is a list of the field names that make up the primary
> > key
> > 2) all primarykey fields will have NOT NULL set even if not specified
> > 3) references are to other keyed tables only
> > 4) references must use tablename.fieldname format, as shown above
> > 5) update_record function is not available
> > 6) web2py rev.1354 (or higher) has appadmin support for keyed tables.
>
> > C) How to use keyed tables?
>
> > They behave almost the same way, the differences are explained below.
>
> > >>> db.kperson.insert(name='Dave')
>
> > {'name': 'Dave'}
>
> > note: insert returns the primary key of the inserted record or None if
> > the record was not inserted
>
> > After some more inserts:
>
> > >>> print db(db.kperson.name!='').select()
>
> > kperson.name
> > Anna
> > Bart
> > Cody
> > Dave
>
> > >>> db.kdog.insert(name='Rex',owner='Cody')
>
> > {'name': 'Rex'}
>
> > >>> db.kdog.insert(name='Fido',owner='Anna')
>
> > {'name': 'Fido'}
>
> > >>> db.kdog.insert(name='Rover',owner='Cody')
>
> > {'name': 'Rover'}
>
> > >>> print db(db.kdog.name!='').select()
>
> > kdog.name,kdog.owner
> > Fido,Anna
> > Rex,Cody
> > Rover,Cody
>
> > >>> print db(db.kdog.owner=='Cody').select()
>
> > kdog.name,kdog.owner
> > Rex,Cody
> > Rover,Cody
>
> > >>> db.kdog.insert(name='Spot',owner='Bart')
>
> > {'name': 'Spot'}
>
> > >>> db(db.kdog.name=='Spot').delete()
>
> > 1
>
> > >>> db(db.kdog.name=='Lassie').delete()
>
> > 0
>
> > note: successful operations return 1, 0 otherwise
>
> > >>> db(db.kdog.name=='Rover').update(owner='Bart')
>
> > 1
>
> > >>> print db(db.kdog.name!='').select()
>
> > kdog.name,kdog.owner
> > Fido,Anna
> > Rex,Cody
> > Rover,Bart
>
> > >>> print 
> > >>> db((db.kdog.owner==db.kperson.name)&(db.kdog.name.like('R%'))).select()
>
> > kdog.name,kdog.owner,kperson.name
> > Rex,Cody,Cody
> > Rover,Bart,Bart
>
> > D) About compound (multiple) keys.
>
> > Compound keys can be defined and used in regular operations by passing
> > a dictionary.
>
> > db.define_table('mperson',
> >   Field('name1'),
> >   Field('name2'),
> >   primarykey=['name1','name2'])
>
> > >>> print db.mperson.insert(name1='Bart',name2='Simpson')
>
> > {'name2': 'Simpson', 'name1': 'Bart'}
>
> > or the equivalent>>> k={'name1': 'Lisa', 'name2':'Simpson'}
> > >>> print db.mperson.insert(**k)
>
> > {'name2': 'Simpson', 'name1': 'Lisa'}
>
> > >>> print db(db.mperson.name1!='').select()
>
> > mperson.name1,mperson.name2
> > Bart,Simpson
> > Lisa,Simpson
>
> > But references are only to single key, for now.
> > Field('x','reference mperson.name2')
>
> > For selects you have to split the key manually.
> > db((db.mperson.name1=='Bart')&(db.mperson.name2=='Simpson')).select()
>
> > E) How can I add support for DB xxx?
>
> > Glad to hear that you want to help, we can use your expertise on xxx.
> > It is not that complicated.
>
> > Step 1:
> > In gluon/sql.py look for SQL_DIALECTS.
> > It is a dictionary of command "translations" for all supported DBs.
> > Now look for the key that represent the DB you want to help adding in.
> > We need two new entries in there, one with key 'reference FK' for
> > field level foreign key and another key 'reference TFK' for table
> > level foreign key.
> > Use the entries under 'mssql' as a guide.
>
> > Step 2:
> > In the same file look for the definition of the insert function for
> > keyed tables (near line 2250 in the latest trunk).
> > Add your DB to the list in the if statement and add an exception using
> > the ones already there as a reference.
>
> > Step 3:
> > Test, test, test...
>
> > ** NOTE **: this is a work in progress.
> > Please report any problems to the group.
> > Ideas for improvement are welcome too.
>
> > Denes.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To post to this group, send email to web2py@googlegroups.com
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to