hi all,
i am working on an open source project  (http://project.askspree.de/)
i need to write this simple sql :

SELECT tg_user.websites_specified AS tg_user_websites_specified,
tg_user.display_name AS tg_user_display_name, tg_user.created AS
tg_user_created, tg_user.user_name AS tg_user_user_name,
tg_user.expertise_calculated_subtree AS
tg_user_expertise_calculated_subtree, tg_user.keywords_specified AS
tg_user_keywords_specified, tg_user.expertise_subtree AS
tg_user_expertise_subtree, tg_user.expertise AS tg_user_expertise,
tg_user.user_id AS tg_user_user_id, tg_user.password AS
tg_user_password, tg_user.email_address AS tg_user_email_address

FROM tg_user LEFT JOIN visit_identity ON
tg_user.user_id=visit_identity.user_id
LEFT JOIN visit ON visit_identity.visit_key=visit.visit_key
WHERE visit_identity.user_id IS NULL OR visit.visit_key IS NULL OR
visit.expiry < now()
ORDER BY tg_user.user_id  LIMIT 10 OFFSET 0



For this i have mapper classes
User            (tg_user)
VisitIdentity  (visit_identity)
Visit            (visit)

problem is that while defining mapper i couldnt set proper relation to
these tables so i have to write condition to outer join these tables
in the query only.
i have tried these options :
1. session.query(User).select_from(
                            text(' LEFT JOIN visit_identity ON
tg_user.user_id==visit_identity.user_id LEFT JOIN visit ON
visit_identity.visit_key==visit.visit_key')
                        ).select(
                        or_(    (VisitIdentity.c.user_id==None) ,
                                (Visit.c.visit_key==None),
                                (Visit.c.expiry < time)
                            ),
                        limit = limit,
                        offset = offset
                        )

it outputs:
SELECT tg_user.*
FROM tg_user, LEFT JOIN visit_identity ON
tg_user.user_id=visit_identity.user_id
LEFT JOIN visit ON visit_identity.visit_key=visit.visit_key,
visit_identity, visit
WHERE visit_identity.user_id IS NULL OR visit.visit_key IS NULL OR
visit.expiry < now()
ORDER BY tg_user.user_id  LIMIT 10 OFFSET 0

means brute force using text wont work here :(

2. select(   [User],
                        from_obj=(
                           outerjoin(
 
User,VisitIdentity,User.c.user_id==VisitIdentity.c.user_id).outerjoin(
 
Visit,VisitIdentity.c.visit_key==Visit.c.visit_key
                            )
                        ),
                    ).filter(
                        or_(    (VisitIdentity.c.user_id==None) ,
                                (Visit.c.visit_key==None),
                                (Visit.c.expiry < time)
                            )
                        )

it gives error that: AttributeError: type object 'User' has no
attribute '_selectable'

3. session.query(User).outerjoin(
 
VisitIdentity,User.c.user_id==VisitIdentity.c.user_id).outerjoin(
 
Visit,VisitIdentity.c.visit_key==Visit.c.visit_key
                        ).select(
                        or_(    (VisitIdentity.c.user_id==None) ,
                                (Visit.c.visit_key==None),
                                (Visit.c.expiry < time)
                            ),
                        limit = limit,
                        offset = offset
                        )

it gives error that:
 TypeError: outerjoin() takes exactly 2 arguments (3 given)

documentation says u can pass condition in this outerjoin() (http://
www.sqlalchemy.org/docs/03/sqlalchemy_sql.html#docstrings_sqlalchemy.sql_modfunc_outerjoin)

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

Reply via email to