Hello Long story cut short, I would like to know if it is possible to generate a query with SQLAlchemy ORM such as the one below and how.
SELECT botany.taxon.id AS botany_taxon_id FROM botany.taxon WHERE EXISTS (SELECT 1 FROM botany.plant JOIN product.article ON botany.plant.id = product.article.plant_id JOIN catalog.catalogitem ON product.article.plant_id = catalog.catalogitem.plant_id AND product.article.article_id = catalog.catalogitem.article_id WHERE :param_1 = catalog.catalogitem.marketingseason_id AND botany.plant.taxon_id = botany.taxon.id ) Put differently, it is like the regular use of EXISTS (http://docs.sqlalchemy.org/en/rel_0_8/orm/tutorial.html#using-exists) but with a more complex subquery that contains JOINs. Is it possible to do such a query? If it can help, I have joined a file (example.py) with all the mapped classes used for the example above and also with a different query that should returns the same results as the one I would like to build here. -- Etienne Rouxel
# -*- coding: utf-8 -*- from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() _taxon_table = Table('taxon', Base.metadata, Column('id', Integer, primary_key=True), schema='botany' ) _plant_table = Table('plant', Base.metadata, Column('id', Integer, primary_key=True), Column('taxon_id', Integer), ForeignKeyConstraint(['taxon_id'], ['botany.taxon.id']), schema='botany' ) _article_table = Table('article', Base.metadata, Column('plant_id', Integer, primary_key=True), Column('article_id', Integer, primary_key=True), ForeignKeyConstraint(['plant_id'], ['botany.plant.id']), schema='product' ) _marketingseason_table = Table('marketingseason', Base.metadata, Column('id', Integer, primary_key=True), schema='catalog' ) _catalogitem_table = Table('catalogitem', Base.metadata, Column('plant_id', Integer, primary_key=True), Column('article_id', Integer, primary_key=True), Column('marketingseason_id', Integer, primary_key=True), ForeignKeyConstraint( ['plant_id', 'article_id'], ['product.article.plant_id', 'product.article.article_id']), ForeignKeyConstraint(['marketingseason_id'], ['catalog.marketingseason.id']), schema='catalog' ) class Taxon(Base): __table__ = _taxon_table class Plant(Base): __table__ = _plant_table taxon = relationship('Taxon', innerjoin=True, backref=backref('plant', uselist=False)) class Article(Base): __table__ = _article_table plant = relationship('Plant', innerjoin=True, backref=backref('articles', cascade='all, delete-orphan')) class Marketingseason(Base): __table__ = _marketingseason_table class Catalogitem(Base): __table__ = _catalogitem_table article = relationship('Article', innerjoin=True, backref=backref('catalogitems', cascade='all, delete-orphan')) marketingseason = relationship('Marketingseason', innerjoin=True, backref=backref('catalogitems')) if __name__ == '__main__': # Initialize database models engine = create_engine('postgresql://nurseryacme_employee@localhost:5432/nurseryacme') Session = sessionmaker(bind=engine) session = Session() marketingseason = Marketingseason(id= -2147483648) taxon = session.query(Taxon).\ filter( Taxon.plant.has( Plant.articles.any( Article.catalogitems.any( Catalogitem.marketingseason == marketingseason)))) print taxon # SQL output: # # SELECT botany.taxon.id AS botany_taxon_id # FROM botany.taxon # WHERE EXISTS (SELECT 1 # FROM botany.plant # WHERE botany.taxon.id = botany.plant.taxon_id AND (EXISTS (SELECT 1 # FROM product.article # WHERE botany.plant.id = product.article.plant_id AND (EXISTS (SELECT 1 # FROM catalog.catalogitem # WHERE product.article.plant_id = catalog.catalogitem.plant_id AND product.article.article_id = catalog.catalogitem.article_id AND :param_1 = catalog.catalogitem.marketingseason_id)))))
signature.asc
Description: OpenPGP digital signature