2011-04-14 19 views
5

में अशक्त का चयन मैंSQLAlchemy

SELECT * FROM 
(SELECT foo, bar FROM baz JOIN quux ON baz.id = quux.id 
    UNION 
SELECT foo, NULL AS bar FROM baz) 
GROUP BY (foo, bar) HAVING foo = 'John Doe'; 

0,6 SQLAlchemy का उपयोग कर के बराबर करना चाहते हैं, लेकिन मैं चुपके से कि NULL वहाँ में नहीं कर पा रहे।

यह मोटे तौर पर क्या मैं अब तक है:

q1 = session.query(Baz.foo, Quux.bar).join(Quux) 
q2 = session.query(Baz.foo, None) 
#       ^^^^ This breaks! 
+0

ऐसा लगता है कि आप बाहरी शामिल होने के बराबर करने की कोशिश कर रहे हैं। शायद MySQL में ऐसा करने का एक तरीका है। – Omnifarious

+0

यह बाहरी शामिल होने के समान ही है। समस्या यह है कि मैं बार = नल के साथ quux से पंक्तियों नहीं चाहता; क्वाक्स में ऐसी कोई पंक्ति नहीं है। मैं उस कॉलम नल के साथ यूनियन में अतिरिक्त पंक्तियां जोड़ना चाहता हूं। – SingleNegationElimination

+0

इसके अलावा, मैंने इस पर एक बहुत अच्छा बिंदु नहीं लगाया, क्योंकि मेरा प्रश्न वास्तव में स्क्लेल्चेमी के बारे में है, लेकिन जिस डेटाबेस पर मैं पूछताछ कर रहा हूं वह वास्तव में फ़ायरबर्ड है। आपूर्ति की गई एसक्यूएल क्वेरी वांछित परिणाम लौटाती है, मैंने अभी यह नहीं पाया है कि एसक्लाल्चेमी में इसे कैसे व्यक्त किया जाए। – SingleNegationElimination

उत्तर

0

एक अन्य विकल्प की तरह, एक का चयन करें बयान के साथ sqlalchemy.text() का उपयोग करने के लिए है:

q1 = session.query(Baz.foo, Quux.bar) \ 
      .join(Quux.bar) 

q2 = session.query(Baz.foo, 
        sqlalchemy.null().label('null_bar')) 

qall = q1.union(q2) 
foocol = qall.column_descriptions[0]['expr'] 
qgrp = qall.group_by([col['name'] for col in qall.column_descriptions]) 
q = qgrp.having(foocol == 'John Doe') 
q.all() 
1

मैं कामयाब इसे बाहर काम करने के लिए। समाधान इस तरह दिखता है:

import sqlalchemy as sa 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 

mymetadata = sa.MetaData() 
Base = declarative_base(metadata=mymetadata) 
Session = sessionmaker(bind=sa.engine) 

session = Session() 

class Person(Base): 
    __tablename__ = 'some_table' 
    id = sa.Column(sa.Integer, primary_key=True) 
    name = sa.Column(sa.String(50)) 


print sa.select([Person.name, sa.text('NULL as null_bar')]) 

>>> SELECT some_table.name, NULL as null_bar 
FROM some_table 
6

एक अभी तक सरल समाधान sqlalchemy.null उपयोग करने के लिए है():

q1 = session.query(Baz.foo, Quux.bar) \ 
      .join(Quux.bar) 

q2 = session.query(Baz.foo, 
        sqlalchemy.sql.expression.literal_column('NULL as null_bar')) 

qall = q1.union(q2) 
foocol = qall.column_descriptions[0]['expr'] 
qgrp = qall.group_by([col['name'] for col in qall.column_descriptions]) 
q = qgrp.having(foocol == 'John Doe') 
q.all()