今天在嘗試用下面的python代碼對MySQL進行數據的插入、更新和刪除時, 突然發現代碼執行成功, 通過代碼查詢也顯示數據已經插入或更新, 但是當我在MySQL客戶端通過SQL語句查詢時, 數據庫中的數據一點變化都沒有。 又反復實驗了多次, 結果都是一樣的。
1 #!/usr/bin/python 2 #Program: 3 # to get some information from mysql 4 import MySQLdb as mdb 5 import sys 6 7 conn = mdb.connect(host = 'localhost', user = 'root', passwd = '8023xue0526', db = 'contact') 8 9 cur = conn.cursor() 10 cur.execute("insert into contact values('222221', 'ni')") 11 cur.execute("select * from contact") 12 row_num = int(cur.rowcount) 13 for i in range(row_num): 14 row = cur.fetchone() 15 print row 16 cur = conn.cursor() 17 conn.close()
通過在網上查找, 最終才有了一點眉目, 此問題與MySQL的存儲引擎對事務的支持有關。 原來MySQL中有多種類型的存儲引擎, 例如: MyISAM, InnoDB等。 MyISAM不支持事務處理, 而InnoDB是事務型數據庫, 支持事務。 我的MySQL的默認存儲引擎就是InnoDB, 所以對數據庫數據的操作會在事先分配的緩存中進行, 只有在commit之后, 數據庫的數據才會改變。 修改后的代碼如下:
1 #!/usr/bin/python 2 #Program: 3 # to get some information from mysql 4 import MySQLdb as mdb 5 import sys 6 7 conn = mdb.connect(host = 'localhost', user = 'root', passwd = '8023xue0526', db = 'contact') 8 9 cur = conn.cursor() 10 cur.execute("insert into contact values('222221', 'ni')") 11 cur.execute("select * from contact") 12 row_num = int(cur.rowcount) 13 for i in range(row_num): 14 row = cur.fetchone() 15 print row 16 #在數據操作完成之后,進行commit,完成數據庫的數據更新 17 conn.commit() 18 cur = conn.cursor() 19 conn.close()
但是以前在用MySQL C API 對數據庫進行數據操作的時候沒有這情況, 通過查看資料, autocommit變量的狀態決定是否每次對數據操作之后自動commit, 在MySQL客戶端里autocommit=ON時, 在客戶端輸入SQL語句, 每次都會自動執行一次commit。 我查看了自己的MySQL的autocommit為ON, 但是還是沒搞清楚為什么同在InnoDB存儲引擎下, autocommit=ON, 用C API 無需commit, 而用Python API 必須commit。 看到此文章的網友如果知道, 多謝你能給我解惑。。