#python #sqlalchemy
#python #sqlalchemy
Вопрос:
Я создаю базу данных в sqlalchemy, и мне нужно обновить родительские задания при добавлении дочернего анализа в таблицу. Я пытаюсь использовать event.listens_for(Jobs.child, "append")
, но функция никогда не вызывается.
Модель базы данных и слушателей выглядит следующим образом:
# parent
class Jobs(db.Model):
__tablename_ = 'jobs'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False)
child = relationship("Analysis", backref="jobs", lazy='dynamic', cascade="all, delete-orphan")
user_id = db.Column(UUID(as_uuid=True), nullable=False)
# 0 = nothing
# 1 = 2d
# 2 = 3d
stage = db.Column(db.Integer, default=0)
# 0 = idle
# 1 = pending
# 2 = running
# 3 = finished
# -1 = failure
status = db.Column(db.Integer, default=0)
action_required = db.Column(db.Boolean, default=False)
def serialize(self):
return {
"id": str(self.id),
"status": self.status,
"stage": self.stage,
"action_required": self.action_required
}
# child
class Analysis(db.Model):
__tablename_ = 'analysis'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False)
parent_id = db.Column(UUID(as_uuid=True), ForeignKey('jobs.id'))
analysis_type = db.Column(db.Integer, nullable=False)
cancel = db.Column(db.BOOLEAN, default=False)
result_code = db.Column(db.Integer, default=0)
output_data = db.Column(db.String)
__mapper_args__ = {'polymorphic_on': analysis_type}
class Analysis2D(Analysis):
__mapper_args__ = {'polymorphic_identity': 1}
num_people = db.Column(db.Integer, default=0)
class Analysis3D(Analysis):
__mapper_args__ = {'polymorphic_identity': 2}
person_id = db.Column(db.Integer, default=0)
db.create_all()
@event.listens_for(Jobs.child, "append")
@event.listens_for(Jobs.child, 'remove')
def receive_append_or_remove(target, value, initiator):
print("This code is not reached.")
target.stage = value.analysis_type
Затем я добавляю объект экземпляра Analysis2D
через:
analysis_2d = Analysis2D(parent_id=my_id)
db.session.add(analysis_2d)
db.session.commit()
Даже когда я добавляю объект типа Analysis
в базу данных, прослушиватель событий не работает.