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