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)
>>>>>>
>>>>>
--