2009-02-18 28 views
7

Tengo un procedimiento almacenado en una base de datos MySQL que simplemente actualiza una columna de fecha y devuelve la fecha anterior. Si llamo a este procedimiento almacenado desde el cliente MySQL, funciona bien, pero cuando intento llamar al procedimiento almacenado desde Python usando MySQLdb, parece que no puedo obtener el valor de retorno.Obtener valores devueltos de un procedimiento almacenado de MySQL en Python, usando MySQLdb

Aquí está el código para el procedimiento almacenado:

CREATE PROCEDURE test_stuff.get_lastpoll() 
BEGIN 
    DECLARE POLLTIME TIMESTAMP DEFAULT NULL; 
    START TRANSACTION; 

    SELECT poll_date_time 
     FROM test_stuff.poll_table 
     LIMIT 1 
     INTO POLLTIME 
    FOR UPDATE; 

    IF POLLTIME IS NULL THEN 
     INSERT INTO 
       test_stuff.poll_table 
       (poll_date_time) 
     VALUES 
       (UTC_TIMESTAMP()); 

     COMMIT; 
     SELECT NULL as POLL_DATE_TIME; 
    ELSE 
     UPDATE test_stuff.poll_table SET poll_date_time = UTC_TIMESTAMP(); 
     COMMIT; 
     SELECT DATE_FORMAT(POLLTIME, '%Y-%m-%d %H:%i:%s') as POLL_DATE_TIME; 
    END IF; 
END 

El código que estoy usando para tratar de llamar al procedimiento almacenado es similar a esto:

#!/usr/bin/python 

import sys 
import MySQLdb 

try: 
    mysql = MySQLdb.connect(user=User,passwd=Passwd,db="test_stuff") 
    mysql_cursor = mysql.cursor() 

    results=mysql_cursor.callproc("get_lastpoll",()) 
    print results 

    mysql_cursor.close() 
    mysql.close() 

except MySQLdb.Error, e: 
    print "MySQL Error %d: %s" % (e.args[0], e.args[1]) 
    sys.exit(1) 

Sé que usted puede hacer Parámetros IN y OUT, pero según lo que puedo determinar a partir de la documentación de MySQLdb, esto no es posible con MySQLdb. ¿Alguien tiene alguna pista de cómo podría obtener los resultados del procedimiento almacenado?

Si lo ejecuto desde una herramienta de SQL, aquí está la salida:

POLL_DATE_TIME  
------------------- 
2009-02-18 22:27:07 

Si ejecuto el script en Python, se vuelve de nuevo un conjunto vacío, así:

() 

Respuesta

11

Lo que tenía que hacer es modificar el código Python para usar execute() en lugar de callproc(), y luego usar el fetchone() para obtener los resultados Estoy respondiendo yo mismo ya que la respuesta de mluebke no fue del todo completa (¡aunque fue útil!).

mysql_cursor.execute("call get_lastpoll();") 
results=mysql_cursor.fetchone() 
print results[0] 

Esto me da el resultado correcto:

2009-02-19 17:10:42 
+0

Cómo pasar el argumento al cursor en este caso – sandeep

6

Todavía tiene que buscar los resultados.

results = cursor.fetchone() 

o

results = cursor.fetchall() 

etc ..

+0

Esto me ayudó a encontrar la respuesta, gracias! – m0j0

8

callproc también funciona bien, no es necesario utilizar execute:

mysql_cursor.callproc("get_lastpoll",()) 
result = mysql_cursor.fetchone() 
0

A partir de la documentación de la API de la biblioteca MySQLdb . Deberá llamar al cursor_obj.nextset() antes de ver el conjunto de resultados devuelto por el procedimiento almacenado. Esto se debe a que la llamada al procedimiento almacenado crea un conjunto de resultados. Los conjuntos de resultados devueltos por el procedimiento almacenado siguen.

More info

+0

Como la documentación que vincula estados, el conjunto de resultados vacío adicional se devuelve * después de * los conjuntos de resultados generados por el procedimiento almacenado. Llamar a 'nextset()' * antes de * recuperar descarta el conjunto de resultados incorrecto. – Air

Cuestiones relacionadas