2009-02-18 164 views
7

我在MySQL數據庫中有一個存儲過程,它只更新日期列並返回前一個日期。如果我從MySQL客戶端調用這個存儲過程,它可以正常工作,但是當我嘗試使用MySQLdb從Python調用存儲過程時,我似乎無法讓它給我返回值。使用MySQLdb從Python獲取MySQL存儲過程的返回值

下面的代碼到存儲過程:

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 2014-10-30 08:52:40

6

你還是必須獲取結果。

results = cursor.fetchone() 

results = cursor.fetchall() 

等。

+0

這幫我找到了答案,謝謝! – m0j0 2009-02-19 17:06:16

8

callproc也能正常工作,你不需要使用execute

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

從API文檔的MySQLdb庫。在你看到存儲過程返回的結果集之前,你需要調用cursor_obj.nextset()。這是因爲對存儲過程的調用會創建一個結果集。隨後存儲過程返回的結果集。

More info

+0

作爲鏈接的文檔狀態,額外的空結果集將*返回*存儲過程生成的結果集之後。在取出之前調用`nextset()`*會丟棄錯誤的結果集。 – Air 2014-07-10 17:57:31