ich eine Reihe von Tabellen, die wie folgt aussehen:SQLAlchemy: Beziehung Tabelle mit zusammengesetzten Primärschlüssel
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),
)
Meine ORM-Klassen wie folgt aussehen:
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"
)
Also in meinem System, jede Aktion eindeutig ist identifiziert durch eine Kombination aus einer Workflow-ID und ihrem Namen. Ich möchte, dass jede Aktion das Attribut parents
und children
hat, das auf ihre übergeordneten und untergeordneten Aktionen verweist. Jede Aktion kann mehrere Eltern und Kinder haben.
Das Problem tritt auf, wenn ich eine Funktion haben, wie zum Beispiel:
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()
ich einen Fehler wie:
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')
Wie erhalte ich die Beziehung der workflow_id richtig eingestellt?
Warum haben Sie müssen tun, um 'workflow_id' in der Tabelle 'action_dependencies'? – van
Da der Primärschlüssel für eine Aktion eine Zusammensetzung aus Name und Workflow-ID ist. Wenn die workflow_id nicht in action_dependencies enthalten ist, gibt es keine Möglichkeit zu ermitteln, auf welche Workflowaktionen sich die Abhängigkeit bezieht. –
Guter Punkt, guter Punkt. Lass mich nachdenken ... – van