I guess another alternative is to hand code it as SQL, so somewhere in 
application do this:

db.sqlexecute('alter table project_details drop constraint 
project_details_pkey;')
db.sqlexecute('alter table project_details add primary key (id, "Oid");')

I'm not sure where the best place to put that might be - it presumably 
shouldn't be in db.py where it will get repeatedly called, but somewhere in 
something like a zzz_indexing.py model file that checks first whether the 
primary keys have been modified?

Cheers,
David

On Thursday, 18 August 2016 13:35:36 UTC+1, David Orme wrote:
>
> 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 web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to