Consider the following example: db=SQLDB('sqlite:memory:') db.define_table('person', db.Field('name')) db.define_table('dog', db.Field('owner',db.person), db.Field('name')) db.dog.owner.requires=IS_IN_DB(db,'person.id','%(name)s')
id=db.person.insert(name="Massimo") db.dog.insert(owner=id,name="Snoopy") Each record is identified by an ID and referenced by that ID. If you have two copies of the database used by distinct web2py installation, the ID is unique only within each database and not across databases. This is a problem when merging records from different databases. In order to make a record uniquely identifiable across databases, they must have: 1) a unique id (uuid), 2) a timestamp (to figure out with one is more recent if multiple copies), 3) reference the uuid instead of id. This can be achieved without modifying web2py. Here is what to do: A) change the model above into: db.define_table('person', db.Field('uuid',length=64,default=uuid.uuid4 ()), db.Field ('modified_on','datetime',default=now), db.Field('name')) db.define_table('dog', db.Field('uuid',length=64,default=uuid.uuid4 ()), db.Field ('modified_on','datetime',default=now), db.Field('owner',length=64), db.Field('name')) db.dog.owner.requires=IS_IN_DB(db,'person.uuid','%(name)s') id=uuid.uuid4() db.person.insert(name="Massimo",uuid=id) db.dog.insert(owner=id,name="Snoopy") B) create a controller to export the database def export(): s=StringIO.StringIO() db.export_to_csv_file(s) response.headers['Content-Type']='text/csv' return s.getvalue() C) create a controller to import a saved copy of the other database and sync records: def import_and_sync(): form=FORM(INPUT(_type='file',_name='data'),INPUT (_type='submit')) if form.accepts(request.vars): db.import_from_csv_file(form.vars.data.file) # for every table for table in db.tables: # for every uuid, delete all but the most recent items=db(db[table].id>0).select(db[table].id,db [table].uuid, orderby=~db[table].modified_on,groupby=db [table].uuid) for item in items: db((db[table].uuid==item.uuid)&(db[table].id! =item.id)).delete() #### exercise return dict(form=form) D) create an index manually to make the search by uuid faster. Notice that B and C work for every database model, they are not specific for this example. Exercise: make the line marked as exercise work on GAE. Massimo --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py Web Framework" 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 -~----------~----~----~----~------~----~------~--~---