Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确更新表对象(元数据)_Python_Sqlalchemy_Sql Update - Fatal编程技术网

Python 如何正确更新表对象(元数据)

Python 如何正确更新表对象(元数据),python,sqlalchemy,sql-update,Python,Sqlalchemy,Sql Update,考虑以下几点: 我知道要更新定义为以下内容的表: class MessageBoard(Base): __tablename__ = "messageboard" id = Column( Integer, Sequence('messageboard_id', optional=True), primary_key=True ) title = Column(Unicode(40), index=True)

考虑以下几点:
我知道要更新定义为以下内容的表:

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语句表示我要更新
代理id
状态

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)
可以找到完整的堆栈跟踪

我也在谷歌上搜索了很多,找不到如何更新上面定义的表并包含多个where子句的示例


更新

我上面的代码有点错误,没有使用:

s.execute(q)
应该是:

q.execute()

我认为这是由
列的
构造函数的
onupdate=“cascade”
参数引起的,该参数的含义与
ForeignKey
onupdate
参数的含义不同

从(我的)重点:

  • onupdate–标量、Python可调用或ClauseElement,表示要应用于UPDATE语句中的列的默认值,如果UPDATE的SET子句中不存在该列,则在UPDATE时将调用该默认值
看起来您希望在
ForeignKey
构造函数中使用
onupdate=“cascade”

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

谢谢你的回复。。。这删除了错误,但它仍然没有更新行,即使在我运行
transaction.commit()
时也是如此。我不得不将我的
s.execute(q)
更改为
q.execute()
。。。它现在可以工作了。
:)