I figured this out. The table has a self reference and web2py inserts a
zero in it instead of NULL. Works for sqlite but not MySQL.
Changing zero with NULL may be treated as a bug fix it will constitute a
minor change of backward compatibility in case you incorrectly do
db(db.table.reference_field==0).select()
while the correct thing to do would be
db(~(db.table.reference_field>0)).select()
I will try fix it and then will ask for comments.
On Monday, 9 April 2012 18:29:10 UTC-5, tomt wrote:
>
> I have declared the table in db.py with auth.signature, and uncommented
> auth.enable_record_versioning(db), but the _archive table isn't created.
> - Tom
>
> On Monday, April 9, 2012 8:33:18 AM UTC-6, Massimo Di Pierro wrote:
>>
>> the signature=True only adds a signature to the auth_* tables so that if
>> a user creates an account for another user or creates a group, you can keep
>> track of who did it.
>>
>> The mything_archive table should be created by:
>>
>> auth.enable_record_versioning(db)
>>
>> This should be called after the mything table is defined. Does it work?
>>
>> On Sunday, 8 April 2012 22:08:47 UTC-5, tomt wrote:
>>>
>>> Hi,
>>> Thanks for your response. I deleted the database as you suggested and
>>> changed signature=False. The problem did go away and I was able to add
>>> users without the error.
>>> I then reverted to signature=True. While subsequent modifications did
>>> show the signature, the 'mything_archive' was never created.
>>>
>>> - Tom
>>>
>>> On Sunday, April 8, 2012 9:04:14 AM UTC-6, Massimo Di Pierro wrote:
>>>>
>>>> Can you try again with mysql, delete the database and replace:
>>>>
>>>> auth.define_tables(signature=True)
>>>> with
>>>> auth.define_tables(signature=False)
>>>>
>>>> Does the problem does away? It looks like it does not like the self
>>>> reference in auth_user.
>>>>
>>>> On Saturday, 7 April 2012 22:09:31 UTC-5, tomt wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> I tried using your new versioning feature in trunk.
>>>>> I created an app using a mysql database:
>>>>> db = DAL('mysql://version:version@localhost/version')
>>>>> When I used the admin function to define a new user
>>>>> I received the following error:
>>>>> ........................................
>>>>> <class 'gluon.contrib.pymysql.err.IntegrityError'>
>>>>> (1452, u'Cannot add or update a child row: a foreign key constraint
>>>>> fails
>>>>> (`version/auth_user`, CONSTRAINT `auth_user_ibfk_1`
>>>>> FOREIGN KEY (`created_by`) REFERENCES `auth_user` (`id`) ON DELETE
>>>>> CASCADE)')
>>>>> ........................................
>>>>>
>>>>> I rebuilt the app to use sqlite instead of mysql:
>>>>> db = DAL('sqlite://storage.sqlite')
>>>>>
>>>>> I was then able to add a user without the error
>>>>>
>>>>> I was using MySQL client version: 5.0.84
>>>>>
>>>>> - any suggestions? - Tom
>>>>>
>>>>> On Thursday, April 5, 2012 4:16:04 PM UTC-6, Massimo Di Pierro wrote:
>>>>>>
>>>>>> This is how it works:
>>>>>>
>>>>>> # define auth
>>>>>> auth = Auth(db, hmac_key=Auth.get_or_create_key())
>>>>>> auth.define_tables(username=True,signature=True)
>>>>>>
>>>>>> # define your own tables like
>>>>>> db.define_table('mything',Field('name'),auth.signature)
>>>>>>
>>>>>> # than do:
>>>>>> auth.enable_record_versioning(db)
>>>>>>
>>>>>> how does it work? every table, including auth_user will have an
>>>>>> auth.signature including created_by, created_on, modified_by,
>>>>>> modified_on,
>>>>>> is_active fields. When a record of table mything (or any other table) is
>>>>>> modified, a copy of the previous record is copied into mything_archive
>>>>>> which references the current record. When a record is deleted, it is not
>>>>>> actually deleted but is_active is set to False, all records with
>>>>>> is_active==False are filtered out in searches except in appadmin.
>>>>>>
>>>>>> Pros:
>>>>>> - your app will get full record archival for auditing purposes
>>>>>> - could not be simpler. nothing else to do. Try with
>>>>>> SQLFORM.grid(db.mything) for example.
>>>>>> - does not break references and there is no need for uuids
>>>>>> - does not slow down searches because archive is done in separate
>>>>>> archive tables
>>>>>>
>>>>>> Cons:
>>>>>> - uses lots of extra memory because every version of a record is
>>>>>> stored (it would be more efficient to store changes only but that would
>>>>>> make more difficult to do auditing).
>>>>>> - slows down db(...).update(...) for multi record because it needs to
>>>>>> copy all records needing update from the original table to the archive
>>>>>> table. This requires selecting all the records.
>>>>>>
>>>>>> Comments? Suggestions?
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>