我有一個模式,其中包含公司的地址列表。對於報告中,我需要做的這些公司的一些過濾和包括他們在所有地區的列表查詢我想寫的相關核心部分是:我使用如何創建從子查詢返回數組的查詢?
SELECT name, ARRAY(SELECT DISTINCT state
FROM location
WHERE location.foo_id=foo.id)
FROM foo;
的基本代碼測試這個是非常簡單的(注意,我使用PostgreSQL作爲我的數據庫):
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())
我已經試過到目前爲止失敗,併產生各種SQLAlchemy的錯誤或無效SQL所有排列。
更新我的產生正是你正在尋找 – van