Please try trunk again.

On Sep 22, 4:34 pm, mwolfe02 <[email protected]> wrote:
> Actually, for sql server it looks like your update just deleted a
> couple of lines that were already commented out.  I've updated my
> patch to work with trunk.  This patch seems to solve the problem on ms
> sql server:
>
> diff --git a/gluon/sql.py b/gluon/sql.py
> --- a/gluon/sql.py
> +++ b/gluon/sql.py
> @@ -3187,7 +3187,7 @@
>              elif self._db._dbname == 'mssql' or \
>                   self._db._dbname == 'mssql2':
>                  if not attributes.get('orderby', None) and
> w2p_tablenames:
> -                    sql_o += ' ORDER BY %s' % ', '.join(['%s.%s'%
> (t,x) for t in w2p_tablenames for x in
> ((hasattr(self._db[t],'_primarykey') and self._db[t]._primarykey) or
> ['id'])])
> +                    sql_o += ' ORDER BY %s' % ', '.join(['%s.%s'%
> (t,x) for t in w2p_tablenames for x in
> ((hasattr(self._db[t],'_primarykey') and self._db[t]._primarykey) or
> [self._db[t]['id'].name] or ['id'])])
>                  sql_s += ' TOP %i' % lmax
>              elif self._db._dbname == 'firebird':
>                  if not attributes.get('orderby', None) and
> w2p_tablenames:
>
> On Sep 22, 10:16 am, mdipierro <[email protected]> wrote:
>
> > actually I just fixed it in trunk for a few APIs which will cover the
> > case you described.
> > There are still a few cases where a custom ID name breaks something.
>
> > Massimo
>
> > On Sep 22, 9:05 am, mdipierro <[email protected]> wrote:
>
> > > turns out this is very difficult to fix with current DAL (sql.py). I
> > > will not happen overnight.
>
> > > Massimo
>
> > > On Sep 21, 4:28 pm, mwolfe02 <[email protected]> wrote:
>
> > > > Here's the patch I came up with.  Massimo, if you've already got a fix
> > > > in, just ignore...
>
> > > > diff --git a/gluon/sql.py b/gluon/sql.py
> > > > --- a/gluon/sql.py
> > > > +++ b/gluon/sql.py
> > > > @@ -3193,7 +3193,7 @@
> > > >                  if not attributes.get('orderby', None) and
> > > > w2p_tablenames:
> > > >  #                     sql_o += ' ORDER BY %s' % ', '.join([t + '.id'
> > > >  #                             for t in w2p_tablenames ])
> > > > -                    sql_o += ' ORDER BY %s' % ', '.join(['%s.%s'%
> > > > (t,x) for t in w2p_tablenames for x in
> > > > ((hasattr(self._db[t],'_primarykey') and self._db[t]._primarykey) or
> > > > ['id'])])
> > > > +                    sql_o += ' ORDER BY %s' % ', '.join(['%s.%s'%
> > > > (t,x) for t in w2p_tablenames for x in
> > > > ((hasattr(self._db[t],'_primarykey') and self._db[t]._primarykey) or
> > > > [self._db[t]['id'].name] or ['id'])])
> > > >                  sql_s += ' TOP %i' % lmax
> > > >              elif self._db._dbname == 'firebird':
> > > >                  if not attributes.get('orderby', None) and
> > > > w2p_tablenames:
>
> > > > On Sep 21, 5:10 pm, mwolfe02 <[email protected]> wrote:
>
> > > > > working on tracing error gets me to line 3196 of sql.py:
>
> > > > > sql_o += ' ORDER BY %s' % ', '.join(['%s.%s'%(t,x) for t in
> > > > > w2p_tablenames for x in ((hasattr(self._db[t],'_primarykey') and
> > > > > self._db[t]._primarykey) or ['id'])])
>
> > > > > Problem is that with this table definition:
> > > > > db.define_table('mytable',
> > > > >     Field('my_id', 'id')
> > > > > )
>
> > > > > This line:
> > > > > hasattr(db.mytable, '_primarykey')  # returns False
>
> > > > > It seems like the above line should return True and
> > > > > db.mytable._primarykey should equal 'my_id'.  Which makes me think the
> > > > > problem actually goes back to define_table.
>
> > > > > -Mike
>
> > > > > On Sep 21, 4:44 pm, mwolfe02 <[email protected]> wrote:
>
> > > > > > I'm using a legacy tables and trying to use the shortcut method of
> > > > > > returning a row/record by passing the value of the ID field directly
> > > > > > to the table.  It appears that 'id' is still hardcoded into the 
> > > > > > logic
> > > > > > at some level, though.  This works:
>
> > > > > > db.mytable(db.mytable.my_id==1)
>
> > > > > > But this does not:
>
> > > > > > db.mytable(1)
>
> > > > > > # returns ProgrammingError: ('42S22', "[42S22] [Microsoft][ODBC SQL
> > > > > > Server Driver][SQL Server]Invalid column name 'id'. (207)
> > > > > > (SQLExecDirectW)")
> > > > > > #    for a table defined as follows:
>
> > > > > > db.define_table('mytable',
> > > > > >     Field('my_id', 'id')
> > > > > > )
>
> > > > > > db.mytable(1)
>
> > > > > > # returns KeyError: 'id'
> > > > > > #    for a table defined as follows:
>
> > > > > > db.define_table('mytable',
> > > > > >     Field('my_id', 'id'),
> > > > > >     primarykey=['my_id']
> > > > > > )
>
> > > > > > I can understand the second case failing, as primarykey seems like 
> > > > > > it
> > > > > > would be usually used to define a multi-field key.  In such a case, 
> > > > > > a
> > > > > > single value would not be enough to identify a record, anyway.  I
> > > > > > tried this simply as a workaround for the original problem, but with
> > > > > > no success.
>
>

Reply via email to