Oh, I see.  I thought that were you mentioned logs you were referring to 
the built-in logs inside web2py (I assume there are some?).  As far as my 
'test app' is concerned all there is is the code I posted a couple of posts 
ago.  I also added these controllers for testing the deletion of records:

def phones():
    form = SQLFORM.grid(query=(db.phone.id > 0))
    return dict(form=form)
    
def carriers():
    form = SQLFORM.grid(query=(db.carrier.id > 0))
    return dict(form=form)
    
def manufacturers():
    form = SQLFORM.grid(query=(db.manufacturer.id > 0))
    return dict(form=form)


All I do is invoke those controllers, add a couple of test entries, and 
then delete a carrier that is being referenced by a couple of phones.  With 
the _before_delete even nothing gets deleted and nothing special is shown 
in the GAE console.  That's what puzzling me.



On Sunday, November 25, 2012 12:13:41 AM UTC-6, howesc wrote:
>
> honestly, i'm not smart enough to use logging.conf.  i'm not sure how much 
> of it is GAE overriding things, and how much of it is my inability to read 
> the docs and understand how it works!  anyhow, i don't have a logging.conf 
> in my GAE setups, but i use logging extensively and it all seems to show up 
> in the GAE console logs just fine.
>
> if you have no logging.conf and you have logging.info statements in your 
> code, can you find the messages in your logs?
>
> cfh
>
> On Saturday, November 24, 2012 5:29:41 AM UTC-8, Julian Sanchez wrote:
>>
>> Are there any specific things I need to do to enable logging under GAE? 
>>  This is what I did:
>>
>>    - renamed the logging.example.conf file to logging.conf
>>    - added an entry for the test app I created above
>>    - removed all references to all handlers except consoleHandler
>>
>> Any page I request gives me an "IOError: invalid mode: a" in the GAE 
>> logging console.  If I renamed the logging file back to 
>> logging.example.conf then I can request pages and run the app just fine. 
>>
>> On Friday, November 23, 2012 7:47:26 PM UTC-6, howesc wrote:
>>>
>>> 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