Python的mysql操作(事務、遊標)
1、mysql事務
MySQL事務主要用於處理操作量大,複雜度高的資料。比如,你操作一個數據庫,公司的一個員工離職了,你要在資料庫中刪除他的資料,也要刪除該人員相關的,比如郵箱,個人資產等。這些資料庫操作語言就構成了一個事務。
在MySQL中只有使用了Innodb資料庫引擎的資料庫或表才支援事務,所以很多情況下我們都使用innodb引擎。
事務處理可以用來維護資料庫的完整性,保證成批的SQL語句要麼全部執行,要麼全部不執行。
一般來說,事務是必須滿足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
1、事務的原子性:一組事務,要麼成功;要麼撤回。
2、穩定性 : 有非法資料(外來鍵約束之類),事務撤回。
3、隔離性:事務獨立執行。一個事務處理後的結果,影響了其他事務,那麼其他事務會撤回。事務的100%隔離,需要犧牲速度。
4、可靠性:軟、硬體崩潰後,InnoDB資料表驅動會利用日誌檔案重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定什麼時候吧事務儲存到日誌裡而mysql在預設的情況下,他是把每個select,insert,update,delete等做為一個事務的,登入mysql伺服器,進入mysql,執行以下命令:
mysql> show variables like 'auto%';
有一個引數autocommit就是自動提交的意思,每執行一個msyql的select,insert,update等操作,就會進行自動提交。
如果把改選項關閉,我們就可以每次執行完一次程式碼就需要進行手動提交,connect物件給我們提供了兩種辦法來操作提交資料。
a) mysql事務的方法
commit():提交當前事務,如果是支援事務的資料庫執行增刪改後沒有commit則資料庫預設回滾,白操作了
rollback():取消當前事務
下面我們來看個例子:
我們先建立一個員工表:
create table employees (
emp_no int not null auto_increment,
emp_name varchar(16) not null,
gender enum('M', 'F') not null,
hire_date date not null,
primary key (emp_no)
);
其中,emp_no為員工id,為主鍵且唯一
emp_name為:員工的名字
gender為:性別,只有M和F兩種選擇
hire_date為:僱傭的時間。
為了試驗的效果,我們插入幾條資料:
insert into employees(emp_no, emp_name,gender, hire_date) values(1001, 'lingjiang', 'M', '2015-04-01');
insert into employees(emp_no, emp_name,gender, hire_date) values(1002, 'xiang', 'M', '2015-04-01');
insert into employees(emp_no, emp_name,gender, hire_date) values(1003, 'shang', 'M', '2015-04-01');
mysql> select * from employees;
+--------+-----------+--------+------------+
| emp_no | emp_name | gender | hire_date |
+--------+-----------+--------+------------+
| 1001 | lingjiang | M |2015-04-01 |
| 1002 | xiang | M | 2015-04-01 |
| 1003 | shang | M | 2015-04-01 |
+--------+-----------+--------+------------+
a) rows in set (0.00 sec)
2.遊標遊標(cursor)
遊標是系統為使用者開設的一個數據緩衝區,存放SQL語句的執行結果使用者可以用SQL語句逐一從遊標中獲取記錄,並賦給主變數,交由python進一步處理,一組主變數一次只能存放一條記錄
在資料庫中,遊標是一個十分重要的概念。遊標提供了一種對從表中檢索出的資料進行操作的靈活手段,就本質而言,遊標實際上是一種能從包括多條資料記錄的結果集中每次提取一條記錄的機制。遊標總是與一條SQL 選擇語句相關聯因為遊標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的遊標位置組成。當決定對結果集進行處理時,必須宣告一個指向該結果集的遊標。
常用方法:
cursor():建立遊標物件 close():關閉此遊標物件
1,建立遊標物件
ImportMySQLdb
db_config= {
'host': '192.168.48.128',
'port': 3306,
'user': 'xiang',
'passwd': '123456',
'db': 'python',
'charset': 'utf8'
}
cnx = MySQLdb.connect(**db_config)
cus = cnx.cursor()
這樣就是建立一個遊標物件,以後我們對mysql的各種操作都是基於遊標進行操作我們通過python程式碼增加一條資料到資料庫中,程式碼如下:
import MySQLdb
def connect_mysql():
db_config = {
'host': '192.168.48.128',
'port': 3306,
'user': 'xiang',
'passwd': '123456',
'db': 'python',
'charset': 'utf8'
}
cnx = MySQLdb.connect(**db_config)
return cnx
if __name__ == '__main__':
cnx = connect_mysql()
cus = cnx.cursor()
sql = ''' create table test(idint not null);insert into test(id) values (100);'''
try:
cus.execute(sql)
cus.close()
cnx.commit()
except Exception as e:
cnx.rollback()
print('Error')
# raise e
finally:
cnx.close()
檢視資料庫中的資料:select * from employees;並沒有發生變化
解釋:
在我們插入資料僱傭時間欄位:hire_date的時候,故意把時間寫錯,導致異常發生,捕獲到異常之後,列印Error,最後關閉mysql連線。cus = cnx.cursor()是建立一個遊標物件。