2009-02-18 23 views
7

У меня есть хранимая процедура в базе данных MySQL, которая просто обновляет столбец даты и возвращает предыдущую дату. Если я вызову эту хранимую процедуру из клиента MySQL, она будет работать нормально, но когда я попытаюсь вызвать хранимую процедуру из Python с помощью MySQLdb, я не могу заставить ее вернуть мне возвращаемое значение.Получение возвращаемых значений из хранимой процедуры MySQL в Python с использованием MySQLdb

Вот код хранимой процедуры:

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 

код, я использую, чтобы попытаться вызвать хранимую процедуру, похожее на это:

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

Я знаю, что вы можете сделать IN и OUT, но из того, что я могу определить из документации MySQLdb, это невозможно в MySQLdb. Кто-нибудь знает, как я могу получить результаты хранимой процедуры?

Если я запускаю его из инструмента SQL, вот вывод:

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

Если я запустить сценарий Python, он возвращается пустое множество, например:

() 

ответ

11

То, что я должен был сделать, это изменить код Python использовать Execute() вместо callproc(), а затем использовать fetchone() чтобы получить результаты. Я сам отвечаю, так как ответ mluebke не был полностью полным (хотя это было полезно!).

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

Это дает мне правильный вывод:

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

Как передать аргумент курсору в этом случае – sandeep

6

Вы все еще должны получить результаты.

results = cursor.fetchone() 

или

results = cursor.fetchall() 

и т.д ..

+0

Это помогло мне найти ответ, спасибо! – m0j0

8

callproc также работает нормально, то вам не нужно использовать execute:

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

Из документации API для MySQLdb библиотеки , Вам нужно будет позвонить cursor_obj.nextset(), прежде чем вы увидите набор результатов, возвращаемый хранимой процедурой. Это связано с тем, что вызов хранимой процедуры создает набор результатов. Последующие результаты возвращаются хранимой процедурой.

More info

+0

В качестве связанной с документацией состояния лишний пустой набор результатов возвращается * после * результирующих наборов, сгенерированных хранимой процедурой. Вызов 'nextset()' * before * fetch отбрасывает неправильный набор результатов. – Air