Рассмотрим следующее:
Я знаю, что для обновления таблицы определяется как:Как правильно обновить таблицу объекта (метаданные)
class MessageBoard(Base):
__tablename__ = "messageboard"
id = Column(
Integer,
Sequence('messageboard_id', optional=True),
primary_key=True
)
title = Column(Unicode(40), index=True)
message = Column(UnicodeText())
to = Column(Unicode(40), index=True)
# message_type = Column(Unicode(40), index=True) #could be email, sms, or PIMS interface
created_by = Column(Unicode(40), index=True)
create_stamp = Column(DateTime(), index=True)
complete_stamp = Column(DateTime(), index=True)
status = Column(Unicode(40), index=True)
# message_type_id = Column(Integer, ForeignKey("board_message_type.id"))
message_type = relationship(BoardMessageType, secondary=message_type_to_message, lazy="joined", join_depth=2, backref="messageboard")
agents = relationship(Agents, secondary=agent_message, lazy="joined", join_depth=2, backref="messageboard")
Может быть обновлена, как:
s.query(
MessageBoard
).filter(
id == 1
).update(
{"title": "How to update?"}
)
Но я не знаю, как обновить таблицу, определенную как:
agent_message = Table(
"agent_message",
Base.metadata,
Column("agents_id", Integer, ForeignKey("agents.id"), primary_key=True, onupdate="cascade"),
Column("message_id", Integer, ForeignKey("messageboard.id"), primary_key=True),
Column("status", Boolean, index=True, default=False) #if READ: True
)
Я пробовал:
q = agent_message.update().where(
and_(agent_message.c.message_id == read, agent_message.c.agents_id == self.user.agents_id)
).values(
{"status": True}
)
s.execute(q)
Но это вызывает ошибку, в которой SQL заявление говорит, что я хочу, чтобы обновить agents_id
и status
:
IntegrityError: (IntegrityError) (1452, 'Cannot add or update a child row: a foreign key constraint fails (`likeminds_prepaid`.`agent_message`, CONSTRAINT `agent_message_ibfk_1` FOREIGN KEY (`agents_id`) REFERENCES `agents` (`id`))', None) u'UPDATE agent_message SET agents_id=?, status=? WHERE agent_message.message_id = ? AND agent_message.agents_id = ?' ('cascade', 1, u'3', 203671L)
Полный StackTrace можно найти here
Я также Гугле много и не может найти пример того, как обновить таблицу, как определено выше, и включить несколько статей, где ...
UPDATE
Мой код выше немного неправильно, вместо использования:
s.execute(q)
Оно должно быть:
q.execute()
Спасибо за ваш ответ ... Это снимало ошибку, но она до сих пор не обновление строки, даже когда я запускаю 'transaction.commit()'. Я должен был изменить свой 's.execute (q)' на 'q.execute()' ... Он теперь работает ':)' – Renier