SQLAlchemy: tabela de relações com chave primária composta
Eu tenho um conjunto de tabelas que se parecem com:
<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>
Minhas classes ORM se parecem com:
<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>
Portanto, no meu sistema, cada ação é identificada exclusivamente por uma combinação de um id de fluxo de trabalho e seu nome. Eu gostaria que cada ação tivesseparents
echildren
atributo que refere suas ações pai e filho. Cada ação pode ter vários pais e filhos.
O problema ocorre quando tenho uma função como:
<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>
Eu recebo um erro como:
<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>
Como obtenho o relacionamento para definir o workflow_id corretamente?