2017-04-04 53 views
0

這是複製的樣本:Python的MySQL的執行查詢循環用光標接近

import mysql.connector 

conn = mysql.connector.connect(
    user='root', password='12347', 
    host='localhost') 

def getCursor(): 
    return conn.cursor() 

def execQuery(cursor=getCursor()): 
    cursor.execute("SELECT 2") 
    cursor.fetchall() 
    cursor.close() 

for i in range(4): 
    cursor = execQuery() 

此代碼的工作,而不cursor.close()。但我覺得奇怪的是,這個樣本與cursor.close作品甚至()用一個簡單的變化:

def execQuery(): 
    cursor=getCursor() 
    cursor.execute("SELECT 2") 
    cursor.fetchall() 
    cursor.close() 

由默認參數移動到函數體。

我不知道是否關閉遊標是最佳做法,所以我可以跳過關閉遊標,同時保持第一種形式。如果不是使用函數的返回值的默認參數的最佳做法,我可以使用第二種形式。 但我想,爲什麼他們採取不同的

這就像我有同樣的錯誤,如下所示:

cursor.execute("SELECT 2") 
cursor.fetchall() 
cursor.close() 
cursor.execute("SELECT 2") 

這就像使用ExecQuery的每個呼叫使用相同的光標,所以它被封鎖在第二個電話會議上。

回答

0

當你需要連接到數據庫時,你需要像光標這樣的東西。您需要一個遊標對象來獲取結果。

在範例(4)中運行循環的示例程序中,它調用execQuery()。在定義中可以看到def execQuery(cursor=getCursor()):該函數將輸入作爲遊標,默認情況下它使用getCursor()函數,該函數在執行循環時創建遊標的所有內容。

在您的程序中,您正在關閉遊標但不再創建它,因此,當第二個執行查詢到來時,沒有光標存在,程序將引發錯誤。

+0

感謝您的回答。我認爲'創建光標所有時間的函數...'應該是'光標*每次*',否? – user3290525

+0

無論如何,從我的理解你的答案,每次'execQuery'在循環中被調用,它創建光標。然後你說我關閉了光標而不是再次創建它。你是說第二次執行'execQuery'時,遊標不會被創建,因爲它被關閉了嗎?你能告訴我爲什麼它不再被創建嗎? – user3290525