将子表中的不同值作为sqlalchemy中父表的属性进行聚合

时间:2016-05-31 19:16:33

标签: python sqlalchemy

我在sqlalchemy中设置了这样的一对多关系:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey

Base = declarative_base()

class Status(Base):
    __tablename__ = 'status'

    name = Column(String(32), primary_key=True, unique=True)

class Chunk(Base):
    __tablename__ = 'chunk'

    id = Column(Integer, primary_key=True)
    taskId = Column(Integer, ForeignKey('task.id'))
    status = Column(String(32), ForeignKey('status.name'), default='unassigned')

class Task(Base):
    __tablename__ = 'task'

    id = Column(Integer, primary_key=True)

Tasks包含Chunks列表。每个块都有自己的status

我想将column_propertyhybrid_property添加到Task,这将返回该任务块的不同状态集。

我试图像这样使用column_property

Task.statuses = column_property(
    select([func.distinct(Chunk.status)]).\
    where(Chunk.taskId == Task.id).\
    correlate(Task.__table__)
)

但是这会给select返回多个值的错误:

sqlalchemy.exc.OperationalError: (OperationalError) (1242, 'Subquery returns more than 1 row')

1 个答案:

答案 0 :(得分:0)

我使用group_concat解决了这个问题。结果以逗号分隔的字符串形式返回,但没关系。

Task.statuses = column_property(
    select([func.group_concat(distinct(Chunk.status))]).\
    where(Chunk.taskId == Task.id).\
    correlate(Task.__table__)
)