2009-02-18 11 views
7

Ho una procedura memorizzata in un database MySQL che aggiorna semplicemente una colonna di data e restituisce la data precedente. Se chiamo questa procedura memorizzata dal client MySQL, funziona bene, ma quando provo a richiamare la procedura memorizzata da Python usando MySQLdb non riesco a convincerlo a darmi il valore restituito.Ottenere valori di ritorno da una procedura memorizzata MySQL in Python, utilizzando MySQLdb

Ecco il codice per la stored procedure:

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 

Il codice che sto usando per cercare di chiamare la stored procedure è simile a questo:

#!/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) 

So che si può fare Parametri IN e OUT, ma da quello che posso determinare dalla documentazione MySQLdb, questo non è possibile con MySQLdb. Qualcuno ha qualche idea su come ottenere i risultati della stored procedure?

Se l'eseguo da uno strumento di SQL, ecco l'output:

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

Se eseguo lo script Python, esso ritorna un insieme vuoto, in questo modo:

() 

risposta

11

Quello che ho dovuto fare è modificare il codice Python per usare execute() al posto di callproc(), e quindi utilizzare il fetchOne() per ottenere i risultati. Lo sto rispondendo da quando la risposta di mluebke non è stata completamente completa (anche se è stato utile!).

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

Questo mi dà l'uscita corretta:

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

Come passare argomento al cursore in questo caso – sandeep

6

Ancora devo recuperare i risultati.

results = cursor.fetchone() 

o

results = cursor.fetchall() 

ecc ..

+0

Questo mi ha aiutato a trovare la risposta, grazie! – m0j0

8

callproc funziona anche bene, non c'è bisogno di utilizzare execute:

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

Dalla documentazione API per la libreria MySQLdb . Dovrai chiamare lo cursor_obj.nextset() prima di vedere il set di risultati restituito dalla stored procedure. Questo perché la chiamata alla stored procedure crea un set di risultati. Seguono i set di risultati restituiti dalla stored procedure.

More info

+0

Come indicato nella documentazione collegata, il set di risultati vuoto extra viene restituito * dopo * i set di risultati generati dalla stored procedure. Chiamando 'nextset()' * prima * il recupero scarta il set di risultati errato. – Air

Problemi correlati