【发布时间】:2022-01-21 19:03:48
【问题描述】:
我正在尝试将 ROW_COUNT() 从 MySQL 存储过程中获取到 python 中。
这是我得到的,但我不知道我错过了什么。
DELIMITER //
CREATE OR REPLACE PROCEDURE sp_refresh_mytable(
OUT row_count INT
)
BEGIN
DECLARE exit handler for SQLEXCEPTION
BEGIN
ROLLBACK;
END;
DECLARE exit handler for SQLWARNING
BEGIN
ROLLBACK;
END;
DECLARE exit handler FOR NOT FOUND
BEGIN
ROLLBACK;
END;
START TRANSACTION;
DELETE FROM mytable;
INSERT INTO mytable
(
col1
, col2
)
SELECT
col1
, col2
FROM othertable
;
SET row_count = ROW_COUNT();
COMMIT;
END //
DELIMITER ;
如果我像下面这样通过普通 SQL 调用它,我会得到插入操作的正确 row_count(例如,插入 26 行):
CALL sp_refresh_mytable(@rowcount);
select @rowcount as t;
-- output: 26
然后在python/mysqlalchemy中:
def call_procedure(engine, function_name, params=None):
connection = engine.raw_connection()
try:
cursor = connection.cursor()
result = cursor.callproc('sp_refresh_mytable', [0])
## try result outputs
resultfetch = cursor.fetchone()
logger.info(result)
logger.info(result[0])
logger.info(resultfetch)
cursor.close()
connection.commit()
connection.close()
logger.info(f"Running procedure {function_name} success!")
return result
except Exception as e:
logger.error(f"Running procedure {function_name} failed!")
logger.exception(e)
return None
finally:
connection.close()
所以我尝试记录获取输出值的不同变体,但它始终为 0 或无。
[INFO] db_update [0]
[INFO] db_update 0
[INFO] db_update None
我错过了什么?
谢谢!
【问题讨论】:
-
this 有帮助吗?
-
感谢@snakecharmerb,非常好的信息,但不幸的是没有关于 sqlalchemy 的信息...
-
raw_connection是一个 DB-API 连接;这里没有涉及 SQLAlchemy。 -
它说:“获得结果......取决于......用于进行调用的python包”。所以那里没有提到 sqlalchemy 包。但是通过这些解决方案的一些试验和错误以及另一个线程中的另一个,我想出了两个可行的解决方案,我将在下面的答案中发布。谢谢!
标签: python mysql stored-procedures sqlalchemy