今天在嘗試用下面的python代碼對MySQL進行數據的插入、更新和刪除時, 忽然發現代碼執行成功, 經過代碼查詢也顯示數據已經插入或更新, 可是當我在MySQL客戶端經過SQL語句查詢時, 數據庫中的數據一點變化都沒有。 又反覆實驗了屢次, 結果都是同樣的。python
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以後, 數據庫的數據纔會改變。 修改後的代碼以下:mysql
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。 看到此文章的網友若是知道, 多謝你能給我解惑。。sql