joinload / энергичная загрузка целых (под) -графов в sqlalchemy - PullRequest
2 голосов
/ 05 октября 2010

Допустим, у меня есть Task объект, который может зависеть от других Tasks.Есть ли способ ощутимо стремиться / объединять весь набор заданных подзадач задачи?

class Task(DeclarativeBase):
    __tablename__ = 'task'

    task_id = Column(Integer, primary_key=True)
    name = Column(String, unique=True)

    def add_dependencies(self, *tasks):
        for task in tasks:
            TaskDependency(dependent=self, dependency=task)
        return self

    @property
    def dependencies(self):
        return [x.dependency for x in self.dependency_edges]

    @dependencies.setter
    def dependencies(self, what):
        "Note: adds dependencies, doesn't remove them" 
        self.add_dependencies(*what)

    @property        
    def dependents(self):
        return [x.dependent for x in self.dependent_edges]

class TaskDependency(DeclarativeBase):
    __tablename__ = 'task_dependency'

    dependent_id = Column(Integer, ForeignKey(Task.task_id), primary_key=True)                        
    dependency_id = Column(Integer, ForeignKey(Task.task_id), primary_key=True)

    dependent = relationship(Task, primaryjoin=dependent_id == Task.task_id, 
                             backref='dependent_edges')

    dependency = relationship(Task, primaryjoin=dependency_id == Task.task_id, 
                              backref='dependency_edges')

def example_task_maker():
    make_cheese = Task(
        name="MAKE_CHEESE",
        dependencies=[
            Task(name="MILK_COWS",
                dependencies=[
                    Task(name="BUY_COWS")
                ]),
        ]
    )


def load_task()
    # How to eagerly load the whole task tree here?
    DBSession.query(Task).filter(name="MAKE_CHEESE").all()

1 Ответ

2 голосов
/ 05 октября 2010

Ах. На самом деле я нашел список смежности, здесь есть примеры, которые я пропустил:

http://docs.sqlalchemy.org/en/latest/orm/relationships.html#adjacency-list-relationships

Я верю, что это сделает то, что я хотел.

...