[sqlalchemy] Re: checking if a column is in a list

2009-01-21 Thread Michael Bayer


On Jan 21, 2009, at 7:46 PM, Jack Stahl wrote:

 Hello,

 I've got a few SQL interfaces where I'd like to change my query  
 based on the columns required by the client.  For example, in one  
 situation, I only join against my User table if my client requires a  
 photo id:

 # cols is the list of columns the client would like selected
 if User.c.photo_id in cols:
 table = table.join(User.table)

 In another situation, I'd like to include the flags column in the  
 query even if the client ask for it

 if not cols:
 cols = [cls]
 elif not (cls.c.flags in cols):
 # ensure flags are there so we can add is_active
 cols.append(cls.c.flags)

 However, my tests for membership pass regardless of whether column  
 is actually in the list cols.  That is,

 Column('flags', BitField(), table=foo_table) in [Column('foo',  
 String(length=84, convert_unicode=False, assert_unicode=None),  
 table=foo_table), Column('bar', Text(length=None,  
 convert_unicode=False, table=foo_table)]

 evaluates to True

 Is the == operator not properly implemented for SQLAlchemy Columns?   
 (I'm using version 0.42)

it is not properly implemented in the sense that it does not return  
True or False, but if you''ve used SQLalchemy, you'd know that we  
redefine the == operator to return ClauseElement objects.   That's  
why you can say somecolumn==5 and get an expression from it.

So you cannot use the in operator to search for a Column object in a  
list.  The solution however is simple.  Use a set() instead, where the  
objects will be compared based on the return value of __hash__() which  
results in an object identity comparison.

if User.c.photo_id in set(cols):


--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~--~~~~--~~--~--~---



[sqlalchemy] Re: checking if a column is in a list

2009-01-21 Thread Jack Stahl
Thanks Michael!
Properly was a poor choice of words on my part.  Yes, of course, == is
overloaded to make where (etc) clauses pretty, I just didn't put two and two
together.
--jack

On Wed, Jan 21, 2009 at 5:38 PM, Michael Bayer mike...@zzzcomputing.comwrote:



 On Jan 21, 2009, at 7:46 PM, Jack Stahl wrote:

  Hello,
 
  I've got a few SQL interfaces where I'd like to change my query
  based on the columns required by the client.  For example, in one
  situation, I only join against my User table if my client requires a
  photo id:
 
  # cols is the list of columns the client would like selected
  if User.c.photo_id in cols:
  table = table.join(User.table)
 
  In another situation, I'd like to include the flags column in the
  query even if the client ask for it
 
  if not cols:
  cols = [cls]
  elif not (cls.c.flags in cols):
  # ensure flags are there so we can add is_active
  cols.append(cls.c.flags)
 
  However, my tests for membership pass regardless of whether column
  is actually in the list cols.  That is,
 
  Column('flags', BitField(), table=foo_table) in [Column('foo',
  String(length=84, convert_unicode=False, assert_unicode=None),
  table=foo_table), Column('bar', Text(length=None,
  convert_unicode=False, table=foo_table)]
 
  evaluates to True
 
  Is the == operator not properly implemented for SQLAlchemy Columns?
  (I'm using version 0.42)

 it is not properly implemented in the sense that it does not return
 True or False, but if you''ve used SQLalchemy, you'd know that we
 redefine the == operator to return ClauseElement objects.   That's
 why you can say somecolumn==5 and get an expression from it.

 So you cannot use the in operator to search for a Column object in a
 list.  The solution however is simple.  Use a set() instead, where the
 objects will be compared based on the return value of __hash__() which
 results in an object identity comparison.

if User.c.photo_id in set(cols):


 


--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~--~~~~--~~--~--~---