[sqlalchemy] Re: distinct (or group by) with max in sqlalchemy - how to?

2009-09-06 Thread Mike Conley
See the documentation at

http://www.sqlalchemy.org/docs/05/sqlexpression.html#functions

Something like this

Using ORM mapped classes

session.query(Tabl.name, func.max(Tabl.cnt)).group_by(Tabl.name).all()

or SQL expression language

select([tabl.c.name,func.max(tabl.c.cnt)]).group_by(tabl.c.name).fetchall()

--~--~-~--~~~---~--~~
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] Help convert my SQL query to SQLAlchemy

2009-09-06 Thread Richie Ward

I would like to convert this query to SQLAlchemy:
SELECT revision_id, modulename, content

FROM content

WHERE revision_id IN (

SELECT MAX(revision_id) FROM content c

GROUP BY modulename

)

AND content != ''

ORDER BY modulename

with this table:
CREATE TABLE content (

revision_id INTEGER NOT NULL,

modulename VARCHAR(256),

content VARCHAR(102400),

summary VARCHAR(256),

created TIMESTAMP,

PRIMARY KEY (revision_id)

)

or:

class Content(DeclarativeBase):
__tablename__ = 'content'

revision_id = Column(Integer, primary_key=True)
modulename = Column(Unicode(256))
content = Column(Unicode(102400), default='')
summary = Column(Unicode(256))
users = relation(User, secondary=ContentUser.__table__,
backref='content')
created = Column(DateTime, default=datetime.now)

I had a go at it myself and heres what I managed to do:
revision_ids = DBSession.query(func.max(Content.revision_id)).group_by
(

Content.modulename).subquery()

pages = DBSession.query(Content.modulename, Content.revision_id,

Content.content).filter(and_(

Content.revision_id.in_(revision_ids),

Content.content != '')).order_by(

Content.modulename)

It worked (as in does not error out) if I remove .subquery() but then
pages does not work as expected, I think I need to use a subquery to
make it work 100%.

Heres the error:
OperationalError: (OperationalError) near SELECT: syntax error
u'SELECT content.modulename AS content_modulename, content.revision_id
AS content_revision_id, content.content AS content_content \nFROM
content, (SELECT max(content.revision_id) AS max_1 \nFROM content
GROUP BY content.modulename) AS anon_1 \nWHERE content.revision_id IN
SELECT max(content.revision_id) AS max_1 \nFROM content GROUP BY
content.modulename AND content.content != ? ORDER BY
content.modulename' ['']

There is a forum thread on my favorable forum where I asked how to
design the query, as I got a bit stuck on the theory behind such a
complex query. This should give you a idea of what I am trying to
achieve.
http://forums.overclockers.co.uk/showthread.php?t=18050830

Thanks alot for your help :)

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