I have a schema which contains a list of addresses for companies. For a report I need to do some filtering for those companies and includes a list of all regions they are in. The relevant core part of the query I am trying to write is:
SELECT name, ARRAY(SELECT DISTINCT state
FROM location
WHERE location.foo_id=foo.id)
FROM foo;
The base code I am using to test this is pretty simple (note that I am using PostgreSQL as my database):
import sqlalchemy as sa
from sqlalchemy.sql import distinct, func
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
Base = declarative_base()
class Company(Base):
__tablename__ = 'company'
id = sa.Column(sa.Integer, sa.Sequence('company_id_seq'), primary_key=True)
name = sa.Column(sa.Unicode)
class Location(Base):
__tablename__ = 'location'
id = sa.Column(sa.Integer, sa.Sequence('location_id_seq'), primary_key=True)
company_id = sa.Column(sa.Integer, sa.ForeignKey(Company.id))
company = relationship(Company, backref='locations')
state = sa.Column(sa.Unicode, nullable=False)
engine = sa.create_engine('postgresql:///pytest', echo=False)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
for (name, states) in [
('Acme', ['Alabama', 'Georgia']),
('Example Inc', ['Florida', 'Florida']),
('Empty', [])]:
session.add(Company(
name=name,
locations=[Location(state=s) for s in states]))
session.flush()
# Desired result:
#
# [('Acme', ['Alabama', 'Georgia']),
# ('Example Inc', ['Florida']),
# ('Empty', [])]
states_per_foo = session.query(distinct(Location.state))\
.filter(Location.company_id == Company.id)
search_query = session.query(Company, func.array(states_per_foo))
print(search_query.all())
All permutations I have tried so far fail with various SQLAlchemy errors or invalid SQL being generated.