为什么从sqlalchemy调用的存储过程不起作用而从workbench调用却起作用?

2024-10-04 11:36:10 发布

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

我有一个存储过程。你知道吗

通过MySQL工作台调用它,如下所示:

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})

我怀疑我传递的参数没有正确绑定?你知道吗


Tags: andfromclientidsqlsqlalchemy过程错误
1条回答
网友
1楼 · 发布于 2024-10-04 11:36:10

我还没有从SQLAlchemy调用存储过程,但是这可能是在事务中,因为您正在使用会话。也许在结尾处调用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()

相关问题 更多 >