我的代码在运行一个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结果图片
不知道更多的命名 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()