Получение значений возврата из хранимой процедуры MySQL в Python, используя MySQLdb - PullRequest
7 голосов
/ 19 февраля 2009

У меня есть хранимая процедура в базе данных MySQL, которая просто обновляет столбец даты и возвращает предыдущую дату. Если я вызываю эту хранимую процедуру из клиента 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, он возвращает пустой набор, например:

()

Ответы [ 4 ]

11 голосов
/ 19 февраля 2009

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

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

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

2009-02-19 17:10:42

См. https://stackoverflow.com/a/52715128/2391795 для расширенного использования fetchone, fetchall и т. Д.

8 голосов
/ 20 июня 2009

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

mysql_cursor.callproc( "get_lastpoll", () )
result = mysql_cursor.fetchone()
6 голосов
/ 19 февраля 2009

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

results = cursor.fetchone()

или

results = cursor.fetchall()
0 голосов
/ 13 октября 2013

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

Подробнее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...