Python MySQLdb存储过程输出参数不工作
我有一个托管在Google Cloud SQL上的数据库,还有一个python脚本来查询它 我试图调用具有Out参数的存储过程。SP调用成功,但Out参数的值似乎没有返回到我的python代码中 例如,以下示例取自: 乘法存储过程的定义:Python MySQLdb存储过程输出参数不工作,python,mysql,mysql-python,google-cloud-sql,Python,Mysql,Mysql Python,Google Cloud Sql,我有一个托管在Google Cloud SQL上的数据库,还有一个python脚本来查询它 我试图调用具有Out参数的存储过程。SP调用成功,但Out参数的值似乎没有返回到我的python代码中 例如,以下示例取自: 乘法存储过程的定义: CREATE PROCEDURE multiply(IN pFac1 INT, IN pFac2 INT, OUT pProd INT) BEGIN SET pProd := pFac1 * pFac2; END 如果我像这样从命令行调用SP: CALL
CREATE PROCEDURE multiply(IN pFac1 INT, IN pFac2 INT, OUT pProd INT)
BEGIN
SET pProd := pFac1 * pFac2;
END
如果我像这样从命令行调用SP:
CALL multiply(5, 5, @Result)
SELECT @Result
args = (5, 5, 0) # 0 is to hold value of the OUT parameter pProd
result = cursor.callproc('multiply', args)
print result
我正确地得到了结果:
+---------+
| @Result |
+---------+
| 25 |
+---------+
但是如果我使用MySQLdb包用python代码调用它,如下所示:
CALL multiply(5, 5, @Result)
SELECT @Result
args = (5, 5, 0) # 0 is to hold value of the OUT parameter pProd
result = cursor.callproc('multiply', args)
print result
然后,我不会在结果元组中获取out参数:
(5, 5, 0)
那么,我做错了什么
更新:
刚刚在callproc代码中发现此警告:
还要注意,callproc函数只返回相同的输入arg元组。所以底线是这是不可能的。回到绘图板,然后…您只需另外选择即可访问输出值:
>>> curs.callproc('multiply', (5, 5, 0))
(5, 5, 0)
>>> curs.execute('SELECT @_multiply_0, @_multiply_1, @_multiply_2')
1L
>>> curs.fetchall()
((5L, 5L, 25L),)
选中此项,请记住仅设置数据库连接到MYSQL数据库初始化,然后尝试以下操作: 为了了解对话内容,数据库表定义: 创建表\u tmp 数据1 INT11, 数据2 VARCHAR10, data3 TINYINT1-这将是输出值 ; 数据库过程的定义: 如果存在sp\U test\U tmp,则执行下降程序; 创建定义器=``@`%`过程`sp\u test\u tmp` IN_数据1 INT ,IN_data2 VARCHAR10中 ,在IN_数据3 BOOL中 ,出结果布尔 开始 插入到表\u tmp中 数据1 ,数据2 ,数据3 价值观 in_数据1 ,in_data2 ,in_data3 ; 设置结果=FALSE;-将输出设置为所需值 承诺;-这将有助于使用变量更新数据库中的更改 -如果选择/获取一点,该行将永远不会更新 -不复杂 终止 Python代码 使用参数列表,我在思考泛型函数
TRUE = 1 -- My own definition, for make compatible Mysql and Python Boolean data representation
FALSE = 0
def execute_procedure(pname='sp_test_tmp',pargs=(1,'co@t.com',TRUE,FALSE)):
try:
cursor = mysql.connect().cursor()
status = cursor.callproc(pname, pargs)
cursor.execute('SELECT @_sp_test_tmp_3') # This is the magic
result = cursor.fetchone() # Get the Values from server
if result[0] == TRUE:
print ("The result is TRUE")
resp = True
elif result[0] == FALSE:
resp = False
print("The result is FALSE")
else:
resp = False
print("This is crazy!!!")
return str(resp)
except Exception as inst:
exception = type(inst)
print(exception)
return "DON'T"
finally:
cursor.close()
5,5,0是打印结果的结果吗?是。我希望第三项是我的out参数的结果?我不知道python,但在其他语言中,不能用值替换by-reference变量。另外,似乎使用函数multiplya,b比使用过程更好。是的,但这只是一个简单的说明性示例。既然您已经回答了自己的问题,即无法从Python中完成,那么您应该将其标记为已回答。是的,这就是我最后讨论的问题。这并不理想,但我想它是有效的