Following up - I've tried some options to set up a table creating the 'id'
field explicitly to work around pairing the two keys.
*A) Declare the field 'id' with type 'id' and set a two part primary key:*
db.define_table('key_test',
Field('id', 'id'),
Field('oid', length=64, default=uuid.uuid4),
primarykey = ['id', 'oid'])
This doesn't work, I think because the type 'id' automatically makes it the
primary key.
*B) Declare an integer field 'id' and set a two part primary key:*
db.define_table('key_test',
Field('id', 'integer'),
Field('oid', length=64, default=uuid.uuid4),
primarykey = ['id', 'oid'])
The table is created without any problems, but id is not a serial with an
id value sequence. I can't immediately find a mechanism to set a field to
have an auto increment sequence independent of using a field type of 'id'.
*C) More complexity with capitalised names*
As if that wasn't enough, the other application is case sensitive and uses
Oid for the field. I can fix this using rname, but then I can't get option
B) to work because the names aren't recognized:
db.define_table('key_test2',
Field('id', 'integer'),
Field('oid', length=64, default=uuid.uuid4, rname='"Oid"'),
primarykey = ['id', 'oid'])
This throws the following back from the PGSQL backend: <class
'gluon.contrib.pg8000.ProgrammingError'> ('ERROR', '42703', 'column "oid"
does not exist'). Which is right, because it doesn't - "Oid" does.
However, this also fails
db.define_table('key_test2',
Field('id', 'integer'),
Field('oid', length=64, default=uuid.uuid4, rname='"Oid"'),
primarykey = ['id', '"Oid"'])
The error thrown is: <type 'exceptions.SyntaxError'> primarykey must be a
list of fields from table 'key_test2. That's also right, of course: "Oid"
is not in db.key_test2.fields
Any suggestions of an approach that might work?
David
On Thursday, 18 August 2016 12:13:23 UTC+1, David Orme wrote:
>
> Hi,
>
> I've got an application that shares a DB with another application running
> a different framework. The setup is that my application declares a set of
> tables that the other application can read from but won't write to, so I
> haven't been exploring the mechanisms for connecting to legacy databases.
>
> However, the other application requires a UUID primary key called Oid, to
> use as a foreign reference in its own tables. I can easily add that as a
> field:
>
> db.define_table('project_details',
> Field('oid', length=64, default=uuid.uuid4, rname='"Oid"'),
> Field('project_id', 'reference project_id'),
> Field('version', 'integer'))
>
> What I can't figure out how to do is add that field to the primary key.
> For legacy tables, it seems like using this would be the approach:
>
> primarykey=['id','oid'],
>
> However, from what I can tell, once you provide primarykey, the usual
> mechanisms for creating the default integer id primary key get disrupted.
>
> Any suggestions?
>
> Thanks,
> David
>
>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.