2013-08-16 47 views
-1

我有一個帶有UNIQUE鍵的數據庫表。如果我想插入一些記錄,有兩種可能的方法。首先,獨特的項目還不存在,沒關係,只是返回新的ID。其次,該項目已經存在,我需要獲得這個獨特記錄的ID。插入後的連接器/ python選擇

問題是,我試過的任何東西,總是有一些例外。

這裏的例子代碼:

def __init__(self, host, user, password, database): 
    # set basic attributes 
    super().__init__(host, user, password, database) 

    #open connection 
    try: 
     self.__cnx = mysql.connector.connect(
       database=database, user=user, password=password, host = host) 

     #self.__cursor = self.__cnx.cursor() 

    except ... 

def insert_domain(self, domain): 

    insertq = "INSERT INTO `sp_domains` (`domain`) VALUES ('{0}')".format(domain) 

    cursor = self.__cnx.cursor() 

    try: 
     cursor.execute(insertq) 
     print("unique") 

    except (mysql.connector.errors.IntegrityError) as err: 
      self.__cnx.commit() 
      print("duplicate") 

      s = "SELECT `domain_id` FROM `sp_domains` WHERE `domain` = '{0}';".format(domain) 

      try: 
       id = cursor.execute(s).fetchone()[0] 

      except AttributeError as err: 
       print("Unable to execute the query:", err, file=sys.stderr) 
      except mysql.connector.errors.ProgrammingError as err: 
       print("Query syntax error:", err, file=sys.stderr) 
    else: 
     self.__cnx.commit() 


    cursor.close() 

點兒,但我嘗試,第一個重複的記錄,我得到是「MySQL連接不可用」,「未讀的結果」。該代碼只是示例來演示它。

這是我使用Connector/python的第一個程序,所以我不知道所有的規則,關於獲取結果,提交查詢等等。

請問誰能幫我解決這個問題?或者是否有任何有效的方式來完成這樣的任務(因爲這似乎不是對我來說最好的解決方案)。感謝您的任何建議。

+0

_你在哪裏得到那個錯誤?它是作爲一個'AttributeError'還是'ProgrammingError'打印的,或者是因爲它們都不是這些或者......而引發的回溯?它來自哪條線? – abarnert

+0

好的,我已經編輯了一點代碼,所以你可以看到建立連接。方法insert_domain()在循環中調用,它在重複項的第一個出現時被壓縮。現在它引發了mysql.connector.errors.OperationalError(「MySQL連接不可用」)異常。在之前的版本中,我猜的是類型錯誤,類似於「NoneType沒有屬性'fetchone'。我不確定我做了什麼更改,現在我正在進行頭腦風暴 – dakov

+0

好吧,」NoneType沒有任何屬性'fetchone' 「是一個明顯的問題 – abarnert

回答

2

我無法修復你的代碼,因爲你給了我們兩個不同版本的代碼和兩個部分描述的錯誤,但沒有完整的信息,但我可以告訴你如何開始。

從評論:

在以前的版本中,它是類型的錯誤,我想,像「NoneType有沒有屬性‘fetchone’

看你的代碼,你的唯一地方。調用fetchone是在這裏:。

id = cursor.execute(s).fetchone()[0] 

所以,很顯然,cursor.execute(s)返回None爲什麼會返回None?好了,這就是它應該返回,根據the documentation *

你想要做的是:

cursor.execute(s) 
id = cursor.fetchone()[0] 

...所有的示例代碼一樣。


併爲未來的參考,這是一個更容易調試這樣的錯誤,如果你首先注意到這行吧,而不是發生扔掉回溯,再破該線成片和記錄的中間值上。通常情況下,你會發現一個不符合你的期望的問題,那時問題會更加明顯,然後在三個步驟後出現異常情況。


*技術上,文件只是說,「返回值沒有定義」爲cursor.execute,所以這將是完全合法的DB-API模塊回到這裏self。再說一次,當你調用一個方法時,返回一些擦除硬盤的對象也是合法的。

+1

哦,我的上帝,我在完全錯誤的地方尋找問題,它解決了所有問題,屬性錯誤被try-catch塊捕獲,所以遊標/連接還沒有準備好進行另一個查詢,這就是爲什麼我有MySQL連接不可用'。 我很抱歉拋出不完整的,不明顯的報告,謝謝你的幫助! – dakov