带有多个属性的Pyodbc过程调用

问题描述 投票:0回答:1

我的代码在运行一个MYSQL存储过程时,从pyodbc返回的是一个空列表,为什么? 如果我从xmapp adminpage运行select,它将返回一个记录。

下面是我的代码。

for i in range(len(call[1])):
    params += "@p"+ str(i) +"=?,"
    attributes.append(call[1][i])

return stmt.execute('{CALL `'+ str(call[0]) +'`('+ str(params) +')}', tuple(attributes)).fetchall()

变量 call 持有来自POST的给定数据。变量 params 保存选择内的@参数。变量 attributes 持有每个 param.

打印的代码是这样的。

{CALL `SELECT-main-program`(@p0=?)} ('0_TEST',)

谢谢你的帮助:),抱歉英语不好。

更新:这是MYSQL xampp管理页面中的SQL调用。

SET @p0='0_TEST'; CALL `SELECT-main-program`(@p0);

这是过程代码。

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `SELECT-main-program`(IN `Programm Name` VARCHAR(255))
SELECT ed_programms.showing_name, ed_programms.scripts, ed_programms.styles, ed_menu.*

FROM ed_programms

JOIN ed_menu
ON ed_menu.id_program = ed_programms.id AND ed_menu.hidden = '0'

WHERE ed_programms.name = @p0 AND ed_programms.active = '1'$$
DELIMITER ;

这是结果。SQL结果图片

python mysql sql flask pyodbc
1个回答
0
投票

不知道更多的命名 IN 在存储过程中的参数,可以考虑将参数 位置上 没有名字。另外,使用更简洁的字符串插值与 str.format (在Python 2.6+中可用)或F-字符串(在Python 3.6+中可用),在外侧的大括号上增加一倍,以满足 CALL:

attributes = list(call[1])
params = ", ".join(['?' for  i in attributes])

sql = "{{CALL {sp} ({prms})}}".format(sp=call[0], prms=params) 
# sql = f"{{CALL {call[0]} ({params})}}"

return stmt.execute(sql, attributes).fetchall()

你是否应该使用MySQL专用的Python DB-API(MySQLdb, MySQLConnector, pymysql),考虑 callproc假设所有的非选择参数都满足以下条件 属性:

attributes = list(call[1])
stmt.callproc(call[0], attributes)

return stmt.fetchall()
© www.soinside.com 2019 - 2024. All rights reserved.