Tengo un conjunto de tablas que se parecen:SQLAlchemy: mesa de Relación con primario compuesto clave
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),
)
Mis clases ORM aspecto:
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"
)
Así que en mi sistema, cada acción es únicamente identificado por una combinación de una identificación de flujo de trabajo y su nombre. Me gustaría que cada acción tenga el atributo parents
y children
que refiere sus acciones principales y secundarias. Cada acción puede tener múltiples padres e hijos.
El problema se produce cuando tengo una función como:
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()
me sale un error como:
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')
¿Cómo consigo la relación a establecer el workflow_id correctamente?
¿Por qué es necesario tener 'workflow_id' en la tabla' action_dependencies'? – van
Porque la clave principal para una acción es un compuesto de su nombre y workflow_id. Si el workflow_id no estuviera en action_dependencies, no habría forma de saber a qué acciones del flujo de trabajo se estaba refiriendo la dependencia. –
Buen punto, buen punto. déjame pensar ... – van