python對MySQL進行數據的插入、更新和刪除以後須要commit,數據庫纔會真的有數據操做。(待往後更新)

  今天在嘗試用下面的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

相關文章
相關標籤/搜索