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?