2014-08-20 2 views
0

Рассмотрим следующее:
Я знаю, что для обновления таблицы определяется как:Как правильно обновить таблицу объекта (метаданные)

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() 

ответ

1

Я думаю, что это вызвано onupdate="cascade" аргумента конструктор Column, который имеет другое значение, чем параметр onupdateForeignKey.

Из Column documentation (курсив):

  • OnUpdate - Скалярное, Python, вызываемая или ClauseElement, представляющий значение по умолчанию, который будет применен к колонке в операторах UPDATE, которые Виль [sic] вызывается при обновлении , если этот столбец отсутствует в предложении SET для обновления.

Похоже, что вы хотите onupdate="cascade" в ForeignKey конструктора вместо:

Column("agents_id", Integer, ForeignKey("agents.id", onupdate="cascade"), primary_key=True) 
+0

Спасибо за ваш ответ ... Это снимало ошибку, но она до сих пор не обновление строки, даже когда я запускаю 'transaction.commit()'. Я должен был изменить свой 's.execute (q)' на 'q.execute()' ... Он теперь работает ':)' – Renier

Смежные вопросы