python對MySQL進行數據的插入、更新和刪除之后需要commit,數據庫才會真的有數據操作。(待日后更新)


  今天在嘗試用下面的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。     看到此文章的網友如果知道, 多謝你能給我解惑。。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM