2009-02-18 25 views
7

Ich habe eine gespeicherte Prozedur in einer MySQL-Datenbank, die einfach eine Datumsspalte aktualisiert und das vorherige Datum zurückgibt. Wenn ich diese gespeicherte Prozedur vom MySQL-Client aus aufrufe, funktioniert es gut, aber wenn ich versuche, die gespeicherte Prozedur von Python mit MySQLdb aufzurufen, kann ich nicht den Rückgabewert erhalten.Rückgabewerte von einer gespeicherten MySQL-Prozedur in Python mit MySQLdb

Hier ist der Code der gespeicherten Prozedur:

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 

Der Code I ist ähnlich wie diese die gespeicherte Prozedur, um zu versuchen bin mit zu nennen:

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

Ich weiß, dass Sie tun können, IN und OUT-Parameter, aber was ich aus der MySQLdb-Dokumentation ermitteln kann, ist dies mit MySQLdb nicht möglich. Hat jemand eine Ahnung, wie ich die Ergebnisse der gespeicherten Prozedur bekommen könnte?

Wenn ich es von einem SQL-Tool ausführen, dann ist hier die Ausgabe:

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

Wenn ich das Python-Skript ausführen, es gibt eine leere Menge zurück, wie folgt aus:

() 

Antwort

11

Was ich tun musste, ist die Python-Code ändern zu verwenden, execute() statt CallProc() und dann die fetchone() verwenden, um die Ergebnisse zu bekommen. Ich beantworte es selbst, weil die Antwort von mllebke nicht vollständig war (obwohl es hilfreich war!).

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

Das gibt mir die korrekte Ausgabe:

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

So übergeben Sie in diesem Fall das Argument an den Cursor – sandeep

6

Sie noch muss die Ergebnisse holen.

results = cursor.fetchone() 

oder

results = cursor.fetchall() 

etc ..

+0

Das half mir die Antwort zu finden, danke! – m0j0

8

callproc auch gut funktioniert, brauchen Sie nicht execute zu verwenden:

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

Von der API-Dokumentation für die MySQLdb Bibliothek . Sie müssen cursor_obj.nextset() aufrufen, bevor Sie die Ergebnismenge sehen, die von der gespeicherten Prozedur zurückgegeben wird. Dies liegt daran, dass der Aufruf der gespeicherten Prozedur eine Ergebnismenge erstellt. Die Ergebnismengen, die von der gespeicherten Prozedur zurückgegeben werden, folgen.

More info

+0

Als die Dokumentation, die Sie verknüpft haben, wird die zusätzliche leere Ergebnismenge zurückgegeben * nach * der von der gespeicherten Prozedur generierten Ergebnismenge. Der Aufruf von 'nextset()' * vor * fetching verwirft die falsche Ergebnismenge. – Air