准备好的语句执行不正确更新

时间:2017-07-25 23:26:53

标签: python mysql sqlalchemy pycharm

所以我在使用SQLAlchemy和MySQL的Python 3.5.2版本中工作。我试图更新表格中订单(行)的状态。这只需要更改一行中一列的值。以下显示我正在使用的功能:

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

执行的参数完全不是预准备语句中显示的参数。它应该只是更新行,其中orderid与作为参数提供的orderid匹配,并从下拉列表中获取状态。

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

我不确定如何诊断此错误。

编辑:我之前忘了提到在首先复制粘贴我的数据库声明脚本后,这个函数在python控制台中实际上可以正常工作。

1 个答案:

答案 0 :(得分:0)

似乎我已经回答了我自己的问题。我记得我之前在程序中查询了订单表,然后将其属性从整数更改为用户友好的字符串。当调用update时,它使用的是现在更改的订单对象,其值与表列类型相矛盾。

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