我有一个存储过程。
通过MySQL工作台调用,工作方式如下;
CALL `lobdcapi`.`escalatelobalarm`('A0001');
但不是来自python程序。(意味着它没有抛出任何异常,进程静默地完成执行)如果我在列名中犯了任何错误,那么在python中我就会得到一个错误。所以它调用了我的存储过程,但没有按预期工作。(这是一个更新查询,.it需要安全更新)
为什么通过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})
我怀疑我通过代码传递的参数没有正确绑定?
发布于 2019-11-22 05:41:35
我还没有从SQLAlchemy调用存储的procs,但这似乎可能是在一个事务中,因为您正在使用会话。也许最后调用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()
https://stackoverflow.com/questions/58987744
复制相似问题