2015-04-14 31 views
1

我有python(3.4)代碼,並且光標不會將其提交到數據庫。如果我通過My​​SQL客戶端手動輸入更改,我可以提交這些更改(所以我確信我在相關表上擁有UPDATE權限)。這段代碼有更新的表信息從一個CSV文件:Python的MySQL連接器 - 光標將不會提交()

#!/bin/python3.4 
import mysql.connector 
import csv 
import sys 

cnx = mysql.connector.connect(user='me', password=sys.argv[1] , host="localhost", database="mydb") 
cursor = cnx.cursor() 
csvfile = open("products.csv", 'r', newline='') 
products = csv.DictReader(csvfile, delimiter = ',', quotechar='"', skipinitialspace=True) 

update_product= ("UPDATE products SET " 
    "ticket_price = %(ticket_price)s, " 
    "quantity_ordered = %(quantity_ordered)s " 
    "WHERE product_code = \"%(product_code)s\";" 
) 
for row in products: 
    data = { 
     "product_code":row["product_code"], 
     "ticket_price":row["ticket_price"], 
     "quantity_ordered":row["quantity_ordered"] 
    } 
    cursor.execute(update_product, data) 
    print(row["product_code"] + " quantity_ordered: " + row["quantity_ordered"]) 
# Commit to the database 
cnx.commit() 
cursor.close() 
csvfile.close() 
cnx.close() 

由於這是一份準備好的聲明,我不相信我可以檢索執行的實際SQL字符串(但調用print(update_product % data)讓我看看怎麼聲明應該出現)。從手動複製粘貼到python解釋器,我相信SQL是好的(cursor.fetchwarnings()不抱怨)。輸入數據很好;打印語句正確讀取。它不會提交 - 數據庫中的所有信息對於這些行都保持爲零。我將這個腳本與幾乎相同的腳本進行了比較,沒有什麼不同。我也試過cnx.autocommit = True,這也不起作用。

任何人都知道怎麼回事,或者如何獲得cursor.execute()connector.commit()返回狀態,以便我可以調試? The API似乎沒有提及,測試使我相信這些方法實際上不會返回一個值。我因此覺得有點失明 - 我應該調用一種方法,祈禱發生了什麼?

編輯: 出於挫折,我剛剛使用print(update_product % data)生成了一個SQL文件。數據庫接受它就好了。我也可以通過python更新products表的靜態值,但不是動態的。

+0

類偏離主題,但在那裏,你不使用Python的Web應用程序框架之一任何理由,即Django的? – davetw12

+0

缺乏時間和幫助;)這肯定會在未來6個月內發生。 – Escher

+0

我知道這需要一些時間和幫助,但是學習Django是你應該承諾的。使用Django模型可以非常輕鬆地完成您現在正在執行的操作。所以您現在正在有效地重新發明輪子,更不用說您的手動方法不可擴展。在https://docs.djangoproject.com/en/1.8/上提供了一步一步的教程,它爲Django入門提供了足夠的幫助。 – davetw12

回答

0

我認爲如果事務被提交,python的.commit()返回true,如果有錯誤(例如)回滾,則返回false。 所以你可以這樣做:

而不是隻有cx.close;

myVariable = cx.close 
if(myVariable == true) 
    print 'Transaction committed' //Or whatever action you want to perform 

else if(myVariable == false) 
    print 'Rollback occurred' //Or whatever action you want to perform 

然後你可以檢查打印語句知道發生了什麼

+0

看來'mysql.connector.cursor.execute()'和'mysql.connector.connection.commit()'都返回無 - 即不返回... – Escher