On Jun 14, 8:51 am, zsouthboy <zsouth...@gmail.com> wrote: > Problem: I don't see how to specify multiple tables with table > references to each other. I can't simply define the relationship, > because the DAL hasn't created a table yet to reference. But I can't > create the table(s) because they reference tables that also don't > exist yet. Catch 22. Besides manually creating the tables (which I > believe prevents me from using the wonderful DAL), what do I do?
FIRST: Field( 'foo', 'reference myself' ) only works for self references; if you want to forward reference tables, use a Field type of integer. I _thought_ at one point forward references were supported by Field( ..... 'reference tablename'), but it clearly is not now (Massimo could speak to the reasons, if any). SECOND: If you change the order of your table definitions, you are left with only one forward reference. I'm not sure you need all the cross references, but if you are convinced you do, try something like: db.define_table('person', Field('username', 'string'), Field('password', 'password'), Field('description', 'text'), Field('email', 'string'), Field('creation_date', 'datetime'), Field('last_login', 'datetime'), Field('image', 'integer'), # a forward reference to db.image ) db.define_table('post', Field('title', 'string'), Field('data', 'text'), Field('date', 'datetime'), Field('owner', db.person), Field('views', 'integer'), Field('published', 'boolean')) db.define_table('image', Field('image', 'upload'), Field('date', 'datetime'), Field('title', 'string'), Field('description', 'string'), Field('postid', db.post), Field('owner', db.person), Field('views', 'integer'), Field('published', 'boolean')) db.define_table('file', Field('file', 'upload'), Field('date', 'datetime'), Field('owner', db.person), Field('views', 'integer'), Field('published', 'boolean')) db.define_table('comment', Field('name', 'string'), Field('person', db.person), Field('date', 'datetime'), Field('data', 'text'), Field('postid', db.post), Field('fileid', db.file), Field('imageid', db.image), Field('published', 'boolean')) > > Example: > db.define_table('image', > Field('image', 'upload'), > Field('date', 'datetime'), > Field('title', 'string'), > Field('description', 'string'), > Field('postid', 'reference post'), > Field('owner', 'reference person'), > Field('views', 'integer'), > Field('published', 'boolean')) > > db.define_table('post', > Field('title', 'string'), > Field('data', 'text'), > Field('date', 'datetime'), > Field('owner', 'reference person'), > Field('views', 'integer'), > Field('published', 'boolean')) > > db.define_table('file', > Field('file', 'upload'), > Field('date', 'datetime'), > Field('owner', 'reference person'), > Field('views', 'integer'), > Field('published', 'boolean')) > > db.define_table('comment', > Field('name', 'string'), > Field('person', 'reference person'), > Field('date', 'datetime'), > Field('data', 'text'), > Field('postid', 'reference post'), > Field('fileid', 'reference file'), > Field('imageid', 'reference image'), > Field('published', 'boolean')) > > db.define_table('person', > Field('username', 'string'), > Field('password', 'password'), > Field('description', 'text'), > Field('email', 'string'), > Field('creation_date', 'datetime'), > Field('last_login', 'datetime'), > Field('image', 'reference image')) > > This fails because the first table defined references tables are are > defined afterwards. (which in turn reference other tables that aren't > defined yet)