More DAL testing...

It is interesting, in that the first time the dal.py code is executed
everything works just fine, however on the very next request I receive
this trackback.

http://paste.pocoo.org/show/214476/

sql.py works just fine for many requests.

I am obviously using the dal in an environment it was not intended,
however sql.py is working so I thought I should mention it.

--
Thadeus





On Sun, Apr 11, 2010 at 12:02 AM, mdipierro <mdipie...@cs.depaul.edu> wrote:
> First of all thank you for your through tests into the DAL.
>
> I worked into this specific issue and I fixed the discrepancy. It
> deserves an explanation anyway. Here is a minimal example to reproduce
> the problem:
>
> code
>  db.define_table('b', Field('b'))
>  db.define_table('c', Field('d'))
>  print db()._select(db.b.ALL, db.c.ALL)
>
> output with sql.py
>  SELECT b.id, b.b, c.id, c.d FROM c, b;
>
> output with dal.py (before fix in trunk)
>  SELECT b.id, b.b, c.id, c.d FROM b;
>
> While only the latter fails, they are both wrong because the original
> query is wrong. It is doing an inner join but it is missing a link
> between table. sql.py assumes you want a cartesian product but that is
> not a good idea because the number of records blows up.
> dal.py did assumes anything (after the fix behaves as sql.py).
>
> In your code you use this as
>
>   if len(db().select(db.person.ALL, db.dog_type.ALL, db.dog.ALL))==0
>
> and if you have 3000 records (1000 in each table) this returns 10^9
> rows. This runs out out RAM. I think you simply want
>
>   if db(db.person.id)count()+db(db.dog_type.id).count()
> +db(db.dog.ALL).count():
>
>
> On Apr 8, 2:57 pm, Thadeus Burgess <thade...@thadeusb.com> wrote:
>> Massimo, I am attaching a application that can replicate this issue.
>>
>> Works fine on sql.py
>>
>> Breaks on dal.py
>>
>> This application is designed after my big application, the represent
>> functions HAVE to stay the same, there cannot be ANY code edits to
>> them!
>>
>> Make sure to run with sql.py first to confirm that it IS working
>> correctly. THEN copy dal.py to sql.py, restart web2py, and then
>> confirm that it no longer works.
>>
>> -Thadeus
>>
>> On Thu, Apr 8, 2010 at 10:12 AM, Thadeus Burgess <thade...@thadeusb.com> 
>> wrote:
>> > Agreed. Lets narrow this down, I will see if I can replicate the issue
>> > on a smaller scale.
>>
>> > -Thadeus
>>
>> > On Wed, Apr 7, 2010 at 11:08 PM, Massimo Di Pierro
>> > <mdipie...@cs.depaul.edu> wrote:
>> >> I guess my question is " why does it not throw an exception in sql.py?" It
>> >> should since
>>
>> >>>> db.dog.owner.represent = lambda value: "%s" % db.person[value].name
>>
>> >> when called with value==None should always result in the error you see in
>> >> dal.py.
>>
>> >> Can you help me debug this? My problem is not why it does not work with
>> >> dal.py (that is the part I understand). My problem is how is it that it
>> >> works with sql.py?
>>
>> >> On Apr 7, 2010, at 10:58 PM, Thadeus Burgess wrote:
>>
>> >>> I am not using different datasets, or using different queries.
>>
>> >>> So here we go, let me explain in every minuet detail this process.
>>
>> >>>>>> cd ~
>> >>>>>> hg clonehttps://web2py.googlecode.com/hgweb2py
>> >>>>>> cd web2py
>> >>>>>> ln -s ~/path/to/my/application applications/pms
>> >>>>>> python web2py.py -a <recycle>
>>
>> >>> *go to 127.0.0.1:8000/pms/default/index
>> >>> *everything works perfectly, I see the page as it should be with
>> >>> records in place, providing the proper "names" (this is only three
>> >>> records, I KNOW they have values)
>>
>> >>>>>> kill -SIGTERM <web2py process id>
>> >>>>>> cd gluon/
>> >>>>>> mv sql.py sql.bak.py
>> >>>>>> ln -s dal.py sql.py
>> >>>>>> cd ..
>> >>>>>> python web2py.py -a <recycle>
>>
>> >>> *go to 127.0.0.1:8000/pms/default/index
>> >>> *receive stacktrace.
>>
>> >>>>>> kill -SIGTERM <web2py process id>
>> >>>>>> cd gluon/
>> >>>>>> rm sql.py
>> >>>>>> mv sql.bak.py sql.py
>> >>>>>> cd ..
>> >>>>>> python web2py.py -a <recycle>
>>
>> >>> *go to 127.0.0.1:8000/pms/default/index
>> >>> *behold, everything works perfectly.
>>
>> >>> Even IF, and I say IF my dataset has a bad reference to a None record,
>> >>> and it executes just fine with sql.py, it should execute with dal.py
>> >>> exactly the same, it should not be throwing the exception.
>>
>> >>> -Thadeus
>>
>> >>> On Wed, Apr 7, 2010 at 10:10 PM, Massimo Di Pierro
>> >>> <mdipie...@cs.depaul.edu> wrote:
>>
>> >>>> I assume it is
>>
>> >>>>> db.dog.owner.represent = lambda value: "%s" % db.person[value].name
>>
>> >>>> The stacktrace you get is because one of your records has owner==None
>> >>>> hence
>> >>>> db.person[value] is also None and None has no .name. It is not a bug. 
>> >>>> You
>> >>>> are doing different queries or using different datasets.
>>
>> >>>> Anyway if you do
>>
>> >>>>> db.define_table('person', Field('name'), format='%(name)s')
>> >>>>> db.define_table('dog', Field('nickname'), Field('owner', db.person))
>>
>> >>>> the requires is set automatically and should take care of this 
>> >>>> exception.
>>
>> >>>> On Apr 7, 2010, at 10:01 PM, Thadeus Burgess wrote:
>>
>> >>>>> I am defining this function.
>>
>> >>>>> db.define_table('person', Field('name'))
>> >>>>> db.define_table('dog', Field('nickname'), Field('owner', db.person))
>>
>> >>>>> db.dog.owner.represent = lambda value: "%s" % db.owner[value].name
>>
>> >>>>> This works in sql.py
>>
>> >>>>> This does not work in dal.py
>>
>> >>>>> You said you made changes, I tested, works just fine on sql.py, and
>> >>>>> has been for quite a while, however I get that stacktrace when I use
>> >>>>> dal.py.
>>
>> >>>>> -Thadeus
>>
>> >>>>> On Wed, Apr 7, 2010 at 8:34 PM, mdipierro <mdipie...@cs.depaul.edu>
>> >>>>> wrote:
>>
>> >>>>>> I guess I do not understand. Who defined this represent function? is
>> >>>>>> it not in your code? Are you saying this is a bug in sql.py?
>>
>> >>>>>> On Apr 7, 7:48 pm, Thadeus Burgess <thade...@thadeusb.com> wrote:
>>
>> >>>>>>> No.
>>
>> >>>>>>> For dal.py to be accepted it has to work exactly like sql.py
>>
>> >>>>>>> Therefore I cannot make ANY code changes if we want a new DAL.
>>
>> >>>>>>> -Thadeus
>>
>> >>>>>>> On Wed, Apr 7, 2010 at 5:31 PM, mdipierro <mdipie...@cs.depaul.edu>
>> >>>>>>> wrote:
>>
>> >>>>>>>> This
>>
>> >>>>>>>> db.TableA.id_TableB.represent = lambda value: "%s" %
>> >>>>>>>> db.TableB[value].name
>>
>> >>>>>>>> should be
>>
>> >>>>>>>> db.TableA.id_TableB.represent = lambda value: (db.TableB[value] or
>> >>>>>>>> {}).get('name','anonymous')
>>
>> >>>>>>>> On Apr 7, 1:36 pm, Thadeus Burgess <thade...@thadeusb.com> wrote:
>>
>> >>>>>>>>> Traceback (most recent call last):
>> >>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/restricted.py", line
>> >>>>>>>>> 173, in restricted
>> >>>>>>>>>  exec ccode in environment
>> >>>>>>>>> File
>>
>> >>>>>>>>> "/home/tburgess/Applications/web2py/applications/pms/views/default/index.html",
>> >>>>>>>>> line 62, in <module>
>> >>>>>>>>>  <thead>
>> >>>>>>>>> File
>>
>> >>>>>>>>> "/home/tburgess/Applications/web2py/applications/pms/models/common.py",
>> >>>>>>>>> line 197, in <lambda>
>> >>>>>>>>>  db.TableA.id_TableB.represent = lambda value: "%s" %
>> >>>>>>>>> db.TableB[value].name
>> >>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line 2402,
>> >>>>>>>>> in __getitem__
>> >>>>>>>>>  return self._db(self.id == key).select().first()
>> >>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line 3276,
>> >>>>>>>>> in
>> >>>>>>>>> select
>> >>>>>>>>>  return self._db._adapter.select(self._query,*fields,**attributes)
>> >>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line 507, 
>> >>>>>>>>> in
>> >>>>>>>>> select
>> >>>>>>>>>  query = self.SELECT(query,*fields, **attributes)
>> >>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line 433, 
>> >>>>>>>>> in
>> >>>>>>>>> SELECT
>> >>>>>>>>>  for field in self.db[table]:
>> >>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line 2102,
>> >>>>>>>>> in __getitem__
>> >>>>>>>>>  return dict.__getitem__(self, str(key))
>> >>>>>>>>> KeyError: 'None'
>>
>> >>>>>>>>> -Thadeus
>>
>> >>>>>>>>> On Mon, Apr 5, 2010 at 6:00 PM, mdipierro <mdipie...@cs.depaul.edu>
>> >>>>>>>>> wrote:
>>
>> >>>>>>>>>> uploading fix. please check it. Thanks for testing this.
>>
>> >>>>>>>>>> On Apr 5, 3:59 pm, Thadeus Burgess <thade...@thadeusb.com> wrote:
>>
>> >>>>>>>>>>> Traceback (most recent call last):
>> >>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/restricted.py",
>> >>>>>>>>>>> line
>> >>>>>>>>>>> 173, in restricted
>> >>>>>>>>>>>  exec ccode in environment
>> >>>>>>>>>>> File
>>
>> >>>>>>>>>>> "/home/tburgess/Applications/web2py/applications/pms/controllers/default.py",
>> >>>>>>>>>>> line 278, in <module>
>> >>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/globals.py", line
>> >>>>>>>>>>> 96,
>> >>>>>>>>>>> in <lambda>
>> >>>>>>>>>>>  self._caller = lambda f: f()
>> >>>>>>>>>>> File
>>
>> >>>>>>>>>>> "/home/tburgess/Applications/web2py/applications/pms/controllers/default.py",
>> >>>>>>>>>>> line 76, in duplicates
>> >>>>>>>>>>>  orderby=db.potentials.A
>> >>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line 
>> >>>>>>>>>>> 3258,
>> >>>>>>>>>>> in select
>> >>>>>>>>>>>  return 
>> >>>>>>>>>>> self._db._adapter.select(self._query,*fields,**attributes)
>> >>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line 512,
>> >>>>>>>>>>> in select
>> >>>>>>>>>>>  return self.parse(rows,self._colnames)
>> >>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line 706,
>> >>>>>>>>>>> in parse
>> >>>>>>>>>>>  (rid._table, rid._record) = (db[referee], None)
>> >>>>>>>>>>> NameError: global name 'db' is not defined
>>
>> >>>>>>>>>>> -Thadeus
>>
>> >>>>>>>>>>> On Mon, Apr 5, 2010 at 3:01 PM, mdipierro
>> >>>>>>>>>>> <mdipie...@cs.depaul.edu>
>> >>>>>>>>>>> wrote:
>>
>> >>>>>>>>>>>> try now
>>
>> >>>>>>>>>>>> On Apr 5, 2:30 pm, Thadeus Burgess <thade...@thadeusb.com> 
>> >>>>>>>>>>>> wrote:
>>
>> >>>>>>>>>>>>> Now I get this for reference field
>>
>> >>>>>>>>>>>>> Traceback (most recent call last):
>> >>>>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/restricted.py",
>> >>>>>>>>>>>>> line
>> >>>>>>>>>>>>> 173, in restricted
>> >>>>>>>>>>>>>  exec ccode in environment
>> >>>>>>>>>>>>> File
>>
>> >>>>>>>>>>>>> "/home/tburgess/Applications/web2py/applications/pms/views/default/index.html",
>> >>>>>>>>>>>>> line 84, in <module>
>> >>>>>>>>>>>>>  {{=db.table[column].represent(d.B[column])}}
>> >>>>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line
>> >>>>>>>>>>>>> 2210,
>> >>>>>>>>>>>>> in __getattr__
>> >>>>>>>>>>>>>  self.__allocate()
>> >>>>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line
>> >>>>>>>>>>>>> 2203,
>> >>>>>>>>>>>>> in __allocate
>> >>>>>>>>>>>>>  self._record = self._table[int(self)]
>> >>>>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line
>> >>>>>>>>>>>>> 2384,
>> >>>>>>>>>>>>> in __getitem__
>> >>>>>>>>>>>>>  return self._db(self.id == key).select().first()
>> >>>>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line
>> >>>>>>>>>>>>> 3258, in select
>> >>>>>>>>>>>>>  return
>> >>>>>>>>>>>>> self._db._adapter.select(self._query,*fields,**attributes)
>> >>>>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line
>> >>>>>>>>>>>>> 512,
>> >>>>>>>>>>>>> in select
>> >>>>>>>>>>>>>  return self.parse(rows,self._colnames)
>> >>>>>>>>>>>>> File "/home/tburgess/Applications/web2py/gluon/sql.py", line
>> >>>>>>>>>>>>> 707,
>> >>>>>>>>>>>>> in parse
>> >>>>>>>>>>>>>  colset[fieldname] = rid = Reference(value)
>> >>>>>>>>>>>>> TypeError: int() argument must be a string or a number, not
>> >>>>>>>>>>>>> 'NoneType'
>>
>> >>>>>>>>>>>>> -Thadeus
>>
>> >>>>>>>>>>>>> On Mon, Apr 5, 2010 at 2:20 PM, mdipierro
>> >>>>>>>>>>>>> <mdipie...@cs.depaul.edu> wrote:
>>
>> >>>>>>>>>>>>>> I fixed the former. I did not fix the latter. It is a known
>> >>>>>>>>>>>>>> problem
>> >>>>>>>>>>>>>> with the
>>
>> ...
>>
>> read more »
>>
>>  web2py.app.test_dalpy.w2p
>> 110KViewDownload
>
>
> --
> To unsubscribe, reply using "remove me" as the subject.
>

Reply via email to