2013-04-24 82 views
2

我試圖打開遊標到MySQL-DB。但我發現了這個錯誤:Python:MySQL連接已打開,但無法創建光標

'NoneType' object has no attribute 'cursor' 

這裏是一個小源代碼:

class Sample: 
    def __init__(self): 
    self.conn = None 
    self.value = self.setValue() 

    def connect(self): 
    self.conn = MySQLdb.connect(...) 
    #cursor = self.conn.cursor() 
    #cursor.execute("SELECT ...") 
    #value = str(cursor.fetchone()[0]) 
    #raise Exception(value) 
    #cursor.close() <- here everything is working fine 

    def setValue(self): 
    if (self.conn == None): 
    self.connect()  
    #raise Exception(self.conn.open) 
    cursor = self.conn.cursor() # ERROR: 'NoneType' object has no attribute 'cursor' 
    ... 

如果我使用的例外,我得到一個1個...連接打開。

如果我在「連接」函數中創建了遊標創建和SQL語句,那麼一切都運行良好。

奇怪的是,一切看起來都是正確的,對於具有相同功能的其他連接,一切都運行良好。我不知道如何解決這個錯誤。我希望有人能指出我正確的方向。

+1

你確定你不錯過一些重要的代碼嗎?難道這不可能是另一條線上的錯誤,或者你把它意外地放到了不同的對象中? – Vyktor 2013-04-24 14:59:29

+0

@Vyktor:我增加了一些代碼。 – Joko 2013-04-24 15:04:18

+0

@eandersson不,你錯了。你應該**總是**手動關閉光標。否則你會得到內存泄漏。 – Vyktor 2013-04-24 15:08:38

回答

0

我會更改檢查連接是否打開的語句,以檢查conn是否爲none以及連接是否打開。因爲你總是執行setValue函數,所以我建議你調用__init__函數內的連接。

class Sample: 
    conn = None 

    def __init__(self): 
    self.connect() 
    self.value = self.setValue() 
    self.close() 

    def connect(self): 
    self.conn = MySQLdb.connect(...) 

    def close(self): 
    if self.conn: 
     self.conn.close() 

    def setValue(self): 
    if not self.conn and not self.conn.open: 
     self.connect() 
    cursor = self.conn.cursor() 

另外,記住與Python的MySQL連接,你需要調用commit你執行一個INSERT或UPDATE語句之後。

cur = self.conn.cursor() 
cur.execute("...") 
self.conn.commit() 
+0

我不認爲這是問題。我只連接一次。 – Joko 2013-04-24 14:58:25

+0

如果存在不同的問題,它不會顯示在您附加的代碼中。考慮向我們展示更多你的代碼。 – eandersson 2013-04-24 15:01:33

+0

@Joko嘗試使用我在答案末尾添加的代碼。 – eandersson 2013-04-24 15:04:19