1

モデルがあります。

class CMiixin(objects):

    @declared_attr
    def x(cls):
        return Column(Float)


class ABase(Base):
    __tablename__ = 'a_base'

    @declared_attr
    def __mapper_args__(cls):
        return {'polymorphic_identity': '%s' % cls.__tablename__,
                'polymorphic_on': cls.type,
                'with_polymorphic': '*'}

    id = Column(Integer, primary_key= True)
    type = Column(String)
    # other attr

class A(CMixin, ABase):
    __tablename__ = 'a'

    id = Column(ForeignKey('a_base.id'), primary_key= True)
    # other attr    

class BBase(Base):
    __tablename__ = 'b_base'

    @declared_attr
    def __mapper_args__(cls):
        return {'polymorphic_identity': '%s' % cls.__tablename__,
                'polymorphic_on': cls.type,
                'with_polymorphic': '*'}

    id = Column(Integer, primary_key= True)
    type = Column(String)
    # other attr

class B(CMixin, ABase):
    __tablename__ = 'b'

    id = Column(ForeignKey('b_base.id'), primary_key= True)
    # other attr        

x(attribute CMixin) <= 5で単一のクエリAとBを選択する方法は? 何かこの db.session.query(???).filter(Ax <= 5, Bx <= 5).all() 結果リストを A と B のオブジェクトにするか、それとも不可能で、2 つの結果を加算するだけですかクエリ?

4

1 に答える 1

1

union_allを試してください:

select1 = Session.query(A.x, <other_columns>).filter(A.x <= 5)
select2 = Session.query(B.x, <other_columns>).filter(B.x <= 5)
result = select1.union_all(select2).all()

アップデート:

私のアプリの1つでテストしました:

engine = get_database_engine()
Session = sessionmaker(bind=engine)
session = Session()


qa = session.query(User.id).filter(User.id>=0)
print qa.all()  # prints [(3,), (4,)]

qb = session.query(Country.id).filter(Country.id>=0)
print qb.all()  # prints [(4,), (5,), (6,), (1,)]

print qa.union_all(qb).all()  # prints  [(3,), (4,), (4,), (5,), (6,), (1,)]

print qa.union_all(qb)

実際のクエリが出力されました:

SELECT anon_1.user_id AS anon_1_user_id 
FROM (SELECT "user".id AS user_id 
      FROM "user" 
      WHERE "user".id >= %(id_1)s 

      UNION ALL 

      SELECT country.id AS country_id 
      FROM country 
      WHERE country.id >= %(id_2)s) AS anon_1
于 2013-06-27T22:15:53.937 に答える