准备语句执行不正确时更新

2024-03-29 07:42:18 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我正在使用Python3.5.2VENV和SQLAlchemy和MySQL。我正在尝试更新表中订单(行)的状态。这只需要更改行中一列的值。下面显示了我正在使用的函数:

def update_order_status(self, order):
    newstatus = self.orderwindow.status.currentIndex()
    orderid = order.orderid

    stmt = update(Order)\
        .where(Order.orderid == orderid).values(status=newstatus)

    session.execute(stmt)   
    session.commit()

newstatus是从当前选择集中获取的整数值 在显示给用户的下拉菜单中。在session.commit()上出现以下错误

   .....

  File "C:\Python35\Python35-32\lib\site-packages\MySQLdb\connections.py", line 292, in query
    _mysql.connection.query(self, query)
sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1366, "Incorrect integer value: 'Patient' for column 'bill' at row 1") [SQL: 'UPDATE `order` SET bill=%s, ship=%s, status=%s, flavor=%s WHERE `order`.orderid = %s'] [parameters: ('Patient', 'Pickup', 'Received', 7, 100000)]

......
Process finished with exit code 1

执行的参数根本不是prepared语句中显示的参数。它应该只更新orderid与作为参数提供给函数的orderid和下拉列表中的状态匹配的行。你知道吗

我已经更新了所有包,并尝试了其他更新方法,包括setattr(order, "status", newstatus)

我不确定如何诊断这个错误。你知道吗

EDIT:我忘了在前面提到,在复制粘贴数据库声明脚本之后,这个函数实际上在python控制台中可以完美地工作。你知道吗


Tags: 函数self参数session状态status错误order
1条回答
网友
1楼 · 发布于 2024-03-29 07:42:18

看来我已经回答了我自己的问题。我记得我在程序的前面查询order表,然后将其属性从整数更改为用户友好的字符串。调用update时,它使用的是现在已更改的order对象,该对象的值与表列类型相矛盾。你知道吗

我不知道update函数试图更新整个对象,而不仅仅是.values()字段中提供的列。因此,我不得不改进对订单的处理,而是将它们放入字典中,并再次引用表以更新原始订单。你知道吗

相关问题 更多 >