Re: [sqlalchemy] SqlAlchemy dynamic query generation

2011-12-23 Thread Pau Tallada
Hi,

Try composing a criteria using and_(), or_(), or its equivalent binary
operators ,|:

crit = literal(false)
crit |= (table.c.field == value)
crit = (table.c.field == value)
etc...


And then:
q = session.query(entity).filter(crit)

2011/12/22 Sana klh sana.kl...@gmail.com


 I tried it but i still get the same error.



 On Thu, Dec 22, 2011 at 2:31 PM, Robert Forkel xrotw...@googlemail.comwrote:

 conditions = [db.User.id==id]
 if user_name != ' ':
   conditions.append(db.User.name == user_name)
 elif age != ' ':
   conditions.append(db.User.age == age)
 elif place != ' ':
   conditions.append(db.User.place == place)

 result = db.User.filter(and_(*conditions)).all()

 might do the trick (untested).

 On Thu, Dec 22, 2011 at 9:53 AM, Sana klh sana.kl...@gmail.com wrote:
  Hi Robert Forkel,
 
  You got it right i am trying to have a combination of expression
 combined in
  and_.
 
  I need to add the attribute only when it is not equal to null.So i
 tried to
  check if it is not null and then from the expression and pass it to
 filter
  .But this does not work.
 
  I went through the document but unable to figure out how to do this
 through
  sql.
 
 
  Thank you
 
  On Thu, Dec 22, 2011 at 12:11 PM, Robert Forkel 
 xrotw...@googlemail.com
  wrote:
 
  You may want to look at the tutorial [1]. In the code you pasted you
  are assembling a string to pass to filter. While you can do that (but
  then it should be proper sql not python!), what you want to do is
  passing a python expression like db.User.age==age, or a combination of
  expressions combined using and_, or_, etc.
 
  [1]
 
 http://www.sqlalchemy.org/docs/orm/tutorial.html#common-filter-operators
 
  On Thu, Dec 22, 2011 at 6:34 AM, Sana klh sana.kl...@gmail.com
 wrote:
   I am getting the following error
  
   ProgrammingError: (ProgrammingError) (1064, You have an error in
 your
   SQL
   syntax; check the manual that corresponds to your MySQL server
 version
   for
   the right syntax to use near '== 1,db.User.age==23,d' at line 3)
  
  
   Is there any way by which i can generate dynamic query?
  
   Thank you
 Sana
  
  
  
   On Thu, Dec 22, 2011 at 4:40 AM, Jackson, Cameron
   cameron.jack...@thalesgroup.com.au wrote:
  
   You might get more help if you provide more details. What error are
 you
   getting?
  
   -Original Message-
   From: sqlalchemy@googlegroups.com [mailto:
 sqlalchemy@googlegroups.com]
   On
   Behalf Of Sana
   Sent: Thursday, 22 December 2011 2:50 AM
   To: sqlalchemy
   Subject: [sqlalchemy] SqlAlchemy dynamic query generation
  
   Hi All,
  
   I am trying to do query based on the user input as follows
  
   condition = 'and_(db.User.id == id'
   if user_name != ' ':
  condition += ',db.User.name == user_name'
   elif age != ' ':
  condition += ',db.User.age == age'
   elif place != ' ':
  condition += ',db.User.place == place'
  
   where = condition+')'
  
   result = db.User.filter(where).all()
  
  
   But Im getting error when i do this.
  
   Is there any way by which i can do this
  
  
   Thank you
 Sana
  
   --
   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.
  
  
  
  
  
 -
   DISCLAIMER: This e-mail transmission and any documents, files and
   previous e-mail messages attached to it are private and
 confidential.
   They may contain proprietary or copyright material or information
 that
   is subject to legal professional privilege.  They are for the use of
   the intended recipient only.  Any unauthorised viewing, use,
   disclosure,
   copying, alteration, storage or distribution of, or reliance on,
 this
   message is strictly prohibited.  No part may be reproduced, adapted
 or
   transmitted without the written permission of the owner.  If you
 have
   received this transmission in error, or are not an authorised
   recipient,
   please immediately notify the sender by return email, delete this
   message and all copies from your e-mail system, and destroy any
 printed
   copies.  Receipt by anyone other than the intended recipient should
 not
   be deemed a waiver of any privilege or protection.  Thales Australia
   does not warrant or represent that this e-mail or any documents,
 files
   and previous e-mail messages attached are error or virus free.
  
  
  
 -
  
   --
   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] SQLalchemy, PostgreSQL/tsearch/ts_rank_cd

2011-12-23 Thread Adam Tauno Williams
I'm stumped how to build the following query in SQLalchemy:

SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(dark  matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC LIMIT 10;

I can do tsearch operations; but I can't figure out the syntax for this
non-join FROM clause.

If I setup using ...

class TextSearchVector(types.UserDefinedType):
def get_col_spec(self):
return 'tsvector'

class SearchVector(ORMEntity):
__tablename__ = 'vista_vectors'
object_id = Column('object_id', Integer, primary_key=True)
entity= Column('entity', String)
version   = Column('version', Integer)
event_date= Column('version', UTCDateTime)
keywords  = Column('keywords', ARRAY(String))
vector= Column('vector', TextSearchVector,
nullable=False)

... then I can query with the following -

tsq = func.to_tsquery('english', 'adam')
z = db.query(SearchVector.object_id).filter(SearchVector.vector.op('@@'
)(tsq)).all()

But -
z = db.query(SearchVector.object_id,
 func.ts_rank_cd(SearchVector.vector, tsq)).\
  filter(SearchVector.vector.op('@@' )(tsq)).all()
- doesn't produce a query with ranking [ the FROM clause only mentions
the table ].

And -
z = db.query(SearchVector.object_id,
 func.ts_rank_cd(SearchVector.vector, tsq)).\
  join(tsq),
  filter(SearchVector.vector.op('@@' )(tsq)).all()
- fails (rather expectedly) with a no-relationship between a  b error.

How does one insert a function call into the FROM???





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