SQLAlchemy: Relationstabelle mit zusammengesetztem Primärschlüssel

Ich habe eine Reihe von Tabellen, die so aussehen:

<code>workflows = Table('workflows', Base.metadata,
                  Column('id', Integer, primary_key=True),
                 )

actions = Table('actions', Base.metadata,
                Column('name', String, primary_key=True),
                Column('workflow_id', Integer, ForeignKey(workflows.c.id), primary_key=True),
               )

action_dependencies = Table('action_dependencies', Base.metadata,
                            Column('workflow_id', Integer, ForeignKey(workflows.c.id), primary_key=True),
                            Column('parent_action', String, ForeignKey(actions.c.name), primary_key=True),
                            Column('child_action', String, ForeignKey(actions.c.name), primary_key=True),
                           )
</code>

Meine ORM-Kurse sehen so aus:

<code>class Workflow(Base):
    __table__ = workflows

    actions = relationship("Action", order_by="Action.name", backref="workflow")


class Action(Base):
    __table__ = actions

    children = relationship("Action",
                            secondary=action_dependencies,
                            primaryjoin=actions.c.name == action_dependencies.c.parent_action,
                            secondaryjoin=actions.c.name == action_dependencies.c.child_action,
                            backref="parents"
                           )
</code>

In meinem System wird jede Aktion durch eine Kombination aus einer Workflow-ID und ihrem Namen eindeutig identifiziert. Ich hätte gerne jede Aktionparents undchildren Attribut, das auf die übergeordneten und untergeordneten Aktionen verweist. Jede Aktion kann mehrere Eltern und Kinder haben.

Das Problem tritt auf, wenn ich eine Funktion habe wie:

<code>def set_parents(session, workflow_id, action_name, parents):
    action = session.query(db.Action).filter(db.Action.workflow_id == workflow.id).filter(db.Action.name == action_name).one()

    for parent_name in parents:
        parent = session.query(db.Action).filter(db.Action.workflow_id == workflow.id).filter(db.Action.name == parent_name).one()
        action.parents.append(parent)

    session.commit()
</code>

Ich erhalte eine Fehlermeldung wie:

<code>IntegrityError: (IntegrityError) action_dependencies.workflow_id may not be NULL u'INSERT INTO action_dependencies (parent_action, child_action) VALUES (?, ?)' (u'directory_creator', u'packing')
</code>

Wie erhalte ich die Beziehung, um die workflow_id korrekt festzulegen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage