2011-12-28 111 views
1

我有一個自定義的類寫入python重新建立一個MySQL連接,如果當前連接已死亡。唯一的問題是,目前的人似乎總是死去,並且總是進入除了我的嘗試之外的其他部分。python mysql自定義重新連接類不保持服務器連接打開

class DB: 
    conn = None 
    def connect(self): 
      try: 
       self.conn = MySQLdb.connect("localhost", "xxxx", "xxxxxx", "Systems") 
      except (AttributeError, Mysqldb.OperationalError), e: 
       raise e 

    def query(self, sql, params): 
      try: 
       cursor = self.conn.cursor() 
       cursor.execute(sql, (params)) 
      except (AttributeError, MySQLdb.OperationalError), e: 
       print 'exception generated during sql connection: ', e 
       self.connect() 
       cursor = self.conn.cursor() 
       cursor.execute(sql, (params)) 
      cursor.close() 
      return cursor 

    def close(self): 
      try: 
       if self.conn: 
        self.conn.close() 
        print '...Closed Database Connection: ' + self.conn 
       else: 
        print '...No Database Connection to Close.' 
      except (AttributeError, MySQLdb.OperationalError), e: 
       raise e 

db = DB() 
db.query(sql, myParams) 

問題是雙重的。 1)當我撥打db.close()時,我得到...No Database Connection輸出。 2)每次我執行db.query(sql, myParams)它進入except子句和輸出exception generated during sql connection:

這似乎是我的數據庫連接在每次查詢調用後關閉自己。但我不知道爲什麼會發生這種情況。任何有關這個問題的幫助將不勝感激。

回答

2
  • 第一次撥打電話到db.query,self.conn等於 無。確實,您第一次撥打電話db.query時,您總是會收到exception generated during sql connection 消息。但是,後續調用 至db.query將不會產生該消息。

    如果添加

    def __init__(self): 
        self.connect() 
    

    那麼當您創建db = DB()self.conn將initialzed。然後 您將不會收到錯誤消息。或者,如果您只想創建按需連接,則只需取出錯誤消息。您可以從DB類中刪除conn = None。當沒有設置self.conn時,代碼仍然會以基本相同的方式工作,即引發AttributeError。

  • 還要注意的是,如果你的sql是一個SELECT語句,你不應該 呼叫cursor.close()DB.query,因爲到 的後續調用cursor.fetchall()將不再工作。


下面是一些示例代碼來表明,與上面提到的變化,exception generated during sql connection消息僅印刷一次,而db.close()打印 ...Closed Database Connection:,它應。

如果您的代碼有其他行爲,請修改下面的代碼以證明其行爲。

import MySQLdb 
import config 

class DB: 
    def connect(self): 
     try: 
      self.conn = MySQLdb.connect("localhost", 
             config.USER, config.PASS, config.MYDB) 
     except (AttributeError, MySQLdb.OperationalError), e: 
      raise e 

    def query(self, sql, params =()): 
     try: 
      cursor = self.conn.cursor() 
      cursor.execute(sql, params) 
     except (AttributeError, MySQLdb.OperationalError) as e: 
      print 'exception generated during sql connection: ', e 
      self.connect() 
      cursor = self.conn.cursor() 
      cursor.execute(sql, params) 
     return cursor 

    def close(self): 
     try: 
      if self.conn: 
       self.conn.close() 
       print '...Closed Database Connection: ' + str(self.conn) 
      else: 
       print '...No Database Connection to Close.' 
     except (AttributeError, MySQLdb.OperationalError) as e: 
      raise e 

db = DB() 
sql = '''DROP TABLE IF EXISTS foo''' 
db.query(sql) 

sql = '''CREATE TABLE foo (bar INT(11))''' 
db.query(sql) 

db.close() 

# exception generated during sql connection: DB instance has no attribute 'conn' 
# ...Closed Database Connection: <_mysql.connection closed at 8769f8c> 

config.py:

USER = 'myusername' 
PASS = 'mypasswd' 
HOST = 'localhost' 
MYDB = 'dbname' 
+0

我同意我的第一次調用db.query()會產生異常,但我的問題是,每個後續調用db.query也正在產生錯誤。 – sadmicrowave 2011-12-28 21:57:08

+0

我已經添加了一些代碼來演示我的意思。我沒有看到每次調用'db.query'時發生異常,只是在第一次調用時(如預期的那樣)。請修改代碼以顯示錯誤。 – unutbu 2011-12-28 22:23:45

+0

對於無知感到遺憾,但是您能否解釋(或提供文檔參考)您正在使用的用於將用戶名,密碼和數據庫傳遞給connect命令的配置方法? – sadmicrowave 2011-12-31 15:27:20