gpt4 book ai didi

python - 为什么从 sqlalchemy 调用的存储过程不起作用,但从 workbench 调用却起作用?

转载 作者:行者123 更新时间:2023-11-29 05:47:03 28 4
gpt4 key购买 nike

我有一个存储过程。

通过 MySQL workbench 调用它如下工作;

CALL `lobdcapi`.`escalatelobalarm`('A0001');

但不是来自 python 程序。 (意味着它不会抛出任何异常,进程静默完成执行)如果我在列名中出现任何错误,那么在 python 中我会得到一个错误。所以它调用了我的存储过程但没有按预期工作。 (这是一个更新查询。它需要安全更新)

为什么通过python sqlalchemy这次更新没有更新任何记录?

CREATE DEFINER=`lob`@`%` PROCEDURE `escalatelobalarm`(IN client_id varchar(50))
BEGIN

SET SQL_SAFE_UPDATES = 0;
update lobdcapi.alarms
set lobalarmescalated=1
where id in (

SELECT al.id
from (select id,alarmoccurredhistoryid from lobdcapi.alarms where lobalarmpriorityid=1 and lobalarmescalated=0 and clientid=client_id
and alarmstatenumber='02' ) as al
inner join lobdcapi.`alarmhistory` as hi on hi.id=al.alarmoccurredhistoryid
and hi.datetimestamp<= current_timestamp() )

);

SET SQL_SAFE_UPDATES = 1;

END

我这样调用它;

from sqlalchemy import and_, func,text


db.session.execute(text("CALL escalatelobalarm(:param)"), {'param': clientid})

我怀疑我通过代码传递的参数没有正确绑定(bind)?

最佳答案

我还没有从 SQLAlchemy 调用存储过程,但是这似乎可能在一个事务中,因为您正在使用 session 。也许在最后调用 db.session.commit() 会有帮助?

如果失败,SQLAlchemy 调用 calling stored procs这里。也许试试他们使用 callproc 的方法。适应您的用例,例如:

connection = db.session.connection()
try:
cursor = connection.cursor()
cursor.callproc("escalatelobalarm", [clientid])
results = list(cursor.fetchall())
cursor.close()
connection.commit()
finally:
connection.close()

关于python - 为什么从 sqlalchemy 调用的存储过程不起作用,但从 workbench 调用却起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58987744/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com