Python Sqlalchemy筛选器父表和父表的子表
我尝试搜索一些模型,因此我希望显示所有父对象的返回结果,其中父对象名为foo或子对象名为foo 我有一个疑问:Python Sqlalchemy筛选器父表和父表的子表,python,sqlalchemy,Python,Sqlalchemy,我尝试搜索一些模型,因此我希望显示所有父对象的返回结果,其中父对象名为foo或子对象名为foo 我有一个疑问: parents = Session.query(Parent).\ join(Child_s3).\ filter(Parent.name.ilike("%foo%")).\ filter(Child_s3.name.ilike("%foo%")).\ order_by(asc(Produc
parents = Session.query(Parent).\
join(Child_s3).\
filter(Parent.name.ilike("%foo%")).\
filter(Child_s3.name.ilike("%foo%")).\
order_by(asc(Product.name))
模型:
class Parent(BaseSO):
__tablename__ = 'parents'
id = Column(Integer, primary_key=True)
name = Column(Unicode(100), nullable=False, unique=True)
colours = relationship('Child_s3', secondary=Parent_images, backref='Parentc')
class Child_s3(BaseSO):
__tablename__ = 'children'
id = Column(Integer, primary_key=True)
name = Column(Unicode)
Parent_images = Table(
'Parent_images', BaseSO.metadata,
Column('parent_id', Integer, ForeignKey('parents.id')),
Column('child_id', Integer, ForeignKey('children.id'))
)
我的查询显示了名为foo的父对象,但没有显示任何父对象,这些父对象也有名为foo的子对象,有人可以帮助构建此查询以搜索两个表中对应的父对象吗?此代码显示了如何使用显式联接或子查询获得结果:
import sqlalchemy as sa
from sqlalchemy import orm
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
Parent_images = sa.Table(
'Parent_images', Base.metadata,
sa.Column('parent_id', sa.Integer, sa.ForeignKey('parents.id')),
sa.Column('child_id', sa.Integer, sa.ForeignKey('children.id'))
)
class Parent(Base):
__tablename__ = 'parents'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.Unicode(100), nullable=False, unique=True)
colours = orm.relationship('Child_s3', secondary=Parent_images, backref='parents')
def __repr__(self):
return 'Parent(name=%s)' % self.name
__str__ = __repr__
class Child_s3(Base):
__tablename__ = 'children'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.Unicode)
def __repr__(self):
return 'Child_s3(name=%s)' % self.name
__str__ = __repr__
if __name__ == '__main__':
engine = sa.create_engine('sqlite:///')
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
Session = orm.sessionmaker(bind=engine)
session = Session()
for parent, child in [('boofoo', 'spam'), ('baz', 'foobar'), ('bar', 'quux')]:
p1 = Parent(name=parent)
session.add(p1)
p1.colours.append(Child_s3(name=child))
session.commit()
print('Join')
session = Session()
q = (session.query(Parent)
.join(Child_s3, Parent.colours)
.filter(sa.or_(Parent.name.ilike('%foo%'),
Child_s3.name.ilike('%foo%'))))
for p in q.all():
print(p, p.colours)
session.commit()
print()
print('Subquery')
session = Session()
q = (session.query(Parent)
.filter(sa.or_(Parent.name.ilike('%foo%'),
Parent.colours.any(Child_s3.name.ilike('%foo%')))))
for p in q.all():
print(p, p.colours)
session.commit()
print()
连接查询
q = (session.query(Parent)
.join(Child_s3, Parent.colours)
.filter(sa.or_(Parent.name.ilike('%foo%'),
Child_s3.name.ilike('%foo%'))))
生成此SQL
选择parents.id作为parents\u id,parents.name作为parents\u name
从父项将父项图像作为父项图像加入父项图像。id=父项图像加入父项图像。id=父项图像加入子项。id=父项图像加入子项图像。id=父项图像加入子项图像
其中lowerparents.name类似于lower或lowerchildren.name类似于lower
子查询
q = (session.query(Parent)
.filter(sa.or_(Parent.name.ilike('%foo%'),
Parent.colours.any(Child_s3.name.ilike('%foo%')))))
生成以下SQL:
选择parents.id作为parents\u id,parents.name作为parents\u name
来自父母
如果lowerparents.name(如lower或)存在,请选择1
从父图像、子图像
其中parents.id=Parent\u images.Parent\u id和children.id=Parent\u images.child\u id和lowerchildren.name
脚本从示例数据生成以下输出:
参加
Parentname=baz[Child\u s3name=foobar]
Parentname=boofoo[Child\u s3name=spam]
子查询
Parentname=boofoo[Child\u s3name=spam]
Parentname=baz[Child\u s3name=foobar]