You cannot define a relation across multiple dbs. You can go around
this limitation by doing:

ann.define_table( 'target'
                , SQLField('username','string')
                , SQLField('thread', 'integer')
                , SQLField('thread_len', 'integer')
                )
ann.target.username.requires=[IS_NOT_EMPTY(),IS_NOT_IN_DB
(iliad,'iliad.username')]

>From the user experience it is the same as what you try to achieve.
The problem is that one backend does not know about the other.

Massimo

On Aug 16, 8:04 pm, Marco <saf...@gmail.com> wrote:
> Hello everyone. I am trying to build an application to annotate some
> data, and I am struggling with the data model. Here is what I have
> written so far:
>
> # coding: utf8
>
> iliad = SQLDB(REMOVED)
> ann = SQLDB(REMOVED)
>
> iliad.define_table('forum',
>     SQLField('name', type = 'string' , length = 32 ),
>     SQLField('url', type = 'longtext' ),
>     migrate = False)
>
> iliad.define_table('post',
>     SQLField('thread_id', type = 'integer' , length = 11 ),
>     SQLField('position', type = 'integer' , length = 11 ),
>     SQLField('text', type = 'longtext' ),
>     SQLField('author', type = 'string' , length = 32 ),
>     SQLField('timestamp', type = 'string' , length = 32 ),
>     migrate = False)
>
> iliad.define_table('thread',
>     SQLField('forum_id', type = 'integer' , length = 11 ),
>     SQLField('url', type = 'longtext' ),
>     SQLField('html', type = 'longtext' ),
>     SQLField('title', type = 'longtext' ),
>     SQLField('summary', type = 'longtext' ),
>     SQLField('posts', type = 'longtext' ),
>     SQLField('updated_at', type = 'datetime' ),
>     SQLField('created_at', type = 'datetime' ),
>     migrate = False)
>
> ann.define_table( 'target'
>                 , SQLField('username','string')
>                 , SQLField('thread', iliad.thread)
>                 , SQLField('thread_len', 'integer')
>                 )
> ann.target.username.requires=[IS_NOT_EMPTY(),IS_NOT_IN_DB
> (iliad,'iliad.username')]
>
> ann.define_table( 'user_qualities'
>                 , SQLField('iliadotator')
>                 , SQLField('target',ann.target)
>                 , SQLField('clarity','integer')
>                 , SQLField('enthusiasm','integer')
>                 , SQLField('proficiency','integer')
>                 )
> ann.user_qualities.username.requires=[IS_NOT_EMPTY(),IS_IN_DB
> (iliad,'iliad.id','iliad.username')]
>
> Please note I have removed the DB location details for security
> reasons. However, both are MySQL databases, running on the same
> server. As you can see, the first three tables refer to data that
> already exists in a database. The later tables need to reference the
> former tables. I am thinking of storing the annotations in a separate
> table from the original data, but I what I have written above is
> rejected with the following traceback:
>
> Traceback (most recent call last):
>   File "/home/mlui/web2py/gluon/restricted.py", line 178, in
> restricted
>     exec ccode in environment
>   File "/home/mlui/web2py/applications/user_annotation/models/db.py",
> line 33, in <module>
>     , SQLField('thread_len', 'integer')
>   File "/home/mlui/web2py/gluon/sql.py", line 1004, in define_table
>     t._create_references()
>   File "/home/mlui/web2py/gluon/sql.py", line 1207, in
> _create_references
>     raise SyntaxError, 'SQLTable: table \'%s\'does not exist' %
> referenced
> SyntaxError: SQLTable: table 'thread'does not exist
>
> Maybe I am making a simple beginner mistake?
>
> Thank you for your time.
>
> Cheers
> Marco
--~--~---------~--~----~------------~-------~--~----~
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