can you add some logging in and let us know if there are exceptions?

about the delete limitations - web2py iterates over the set of items to 
delete and deletes them (the version in trunk is improved over the last 
release, but both still work).  if the set of items to delete is large the 
query to get the items to delete may take too long and timeout.  in the 
latest released version it actually can timeout before any rows are 
deleted.  in the trunk version it will delete at least some rows before the 
first timeout (in most cases), so over a series of retries all the rows 
will be deleted.  This behavior is all to deal with how GAE implements 
delete, so it is GAE specific.

cfh


On Wednesday, November 21, 2012 5:04:32 PM UTC-8, Julian Sanchez wrote:
>
> Massimo,
>
> I created a small test to try your function:
>
> db.define_table('carrier',
>                 Field('name', type='string'),
>                 Field('description', type='string')
>                )
>                
> db.carrier.name.requires = IS_NOT_IN_DB(db(db.carrier.id > 0), '
> carrier.name')               
>                
> db.define_table('manufacturer',
>                 Field('name', type='string'),
>                 Field('country', type='string')
>                )
>
>
> db.manufacturer.name.requires = IS_NOT_IN_DB(db(db.manufacturer.id > 0), '
> manufacturer.name')                              
>                               
> db.define_table('phone',
>                 Field('model', type='string'),
>                 Field('manufacturer', db.manufacturer),
>                 Field('carrier', db.carrier)
>                )
>                
> db.phone.manufacturer.requires = IS_IN_DB(db, 'manufacturer.id', 
> '%(name)s')
> db.phone.carrier.requires = IS_IN_DB(db, 'carrier.id', '%(name)s')
>
>
>
>
> def delete_linked(query, table=db.carrier):
>     ids = [t.id in db(query).select(db.table.id)]
>     for field in table._referenced_by:
>          db(field._table._id.belongs(ids)).delete()
>
>
> db.carrier._before_delete.append(delete_linked)
>
> I can create an Apple iPhone on Verizon and an Apple iPhone on Sprint.  If 
> I run this under sqlite and I delete the carrier 'Sprint' I see one of the 
> phones deleted as well (even without the '_before_delete' event which makes 
> sense since that's the default behavior). 
> However if I run this under GAE:
>
>    - Without the '_before_delete' event the carrier 'Sprint' is deleted 
>    but not the phone.  This is expected since cascading doesn't work.
>    - With the '_before_delete' event (code just as above) *nothing* gets 
>    deleted, not even the carrier.  I can see it disappear from the list but 
> if 
>    I refresh the page it comes right back.  I can also verify the record is 
>    still there by looking at the GAE admin page (Datastore viewer).  Also, 
>    none of the phones are deleted either.
>    
> Am I missing something?
>
> Also, when you say that if I delete too many records the operation may 
> fail midway... is that a GAE limitation?  Is the 1000 record limit I've 
> read somewhere about?
>
> Thanks,
> Julian
>
> On Saturday, November 17, 2012 1:06:01 PM UTC-6, Massimo Di Pierro wrote:
>>
>> You can try something like
>>
>> def delete_linked(query, table=table):
>>     ids = [t.id in db(query).select(db.table.id)]
>>     for field in table._referenced_by:
>>          db(field._table._id.belongs(ids)).delete()
>>
>> db.table._before_delete.append(delete_linked)
>>
>> but you will run into consistency problems. If there are too many records 
>> this may fail midway.
>>
>> On Wednesday, 14 November 2012 19:07:02 UTC-6, Julian Sanchez wrote:
>>>
>>> Hi Everyone!!  Long time lurker & first time posting...
>>>
>>> I am working on a simple application that I intend to deploy in GAE.  I 
>>> have a few tables with fields that reference other tables which by default 
>>> enables the ondelete=CASCADE behavior.  This works fine when I run the app 
>>> locally using sqlite as the database.
>>> I believe GAE doesn't support cascading deletes natively. 
>>> I presume web2py doesn't support cascading deletes when running under 
>>> GAE because I don't see that happening.  When I delete a row (rendered 
>>> through SQLFORM.grid) only that row is deleted an all dependent tables 
>>> remain untouched.
>>>
>>> The problem I have is that I can't find a way for me to implement the 
>>> cascading behavior manually.  I added a 'ondelete=mydelete' event for the 
>>> SQLFORM.grid where I do the manual delete of the dependent tables and 
>>> commit in the database, but that doesn't seem to work either.  I searched 
>>> through this forum but didn't find any suggestions either.  Any suggestions 
>>> as to what could I do to solve this??  Do I have to stay away from 
>>> SQLFORM.grid to avoid this problem?
>>>
>>> Many Thanks!!
>>> Julian
>>>
>>> I am using web2py Version 2.2.1 (2012-10-21 16:57:04) stable on OS X 
>>> Mountain Lion and GoogleAppEngineLauncher version 1.7.3 (1.7.3.333)
>>>
>>

-- 



Reply via email to