Python MySQLdb存储过程输出参数不工作

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

我有一个托管在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 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中完成,那么您应该将其标记为已回答。是的,这就是我最后讨论的问题。这并不理想,但我想它是有效的