python學習-使用MySQLdb操作mysql資料庫
操作環境為python2.7 centos7
一、MySQLdb的安裝與配置
MySQLdb是用於Python連線mysql資料庫的介面,它實現了Python資料庫api規範2.0。
按照以下方式安裝
yum install epel-release yum install python-pip yum install python-devel yum install mysql-devel pip install MySQL-python
安裝完模組後,使用時匯入模組名即可
import MySQLdb
二、資料庫準備
建立一個數據庫為了準備研究使用
1、建立資料庫TESTDB
2、在TESTDB資料庫中建立表EMPLOYEE
3、EMPLOYEE表字段為ID,FIRST_NAME,LAST_NAME,AGE,SEX
4、連線資料TESTDB使用用使用者名稱為"testuser",密碼“test123"
建立完資料表配置命令如下
ctreate database TESTDB charset utf8; use TESTDB; create table EMPLOYEE( ID int primary key auto_increment, FIRST_NAME varchar(10) not null, LAST_NAME varchar(10) not null, AGE int not null, SEX varchar(10) not null ); desc EMPLOYEE;
建立資料庫使用者
create user 'testuser'@'localhost' identified by 'test123';#建立使用者 grant all privileges on TESTDB.* to 'testuser'@'%' identified by 'test123' with grant option;#指定使用者testuser可以從任何位置訪問TESTDB資料下的任何表,擁有全部許可權 flush privileges; revoke drop on *.* from 'testuser'@'%'; #移除使用者testuser從任何位置刪除許可權 flush privileges;
驗證是否能偶遠端登陸
至此,資料庫準備完畢
三、MySQLdb基本方法
3.1connect函式
host:資料庫服務的地址,預設通過UNINX socket訪問本地資料庫;
user:登陸資料庫的使用者名稱
passwd 登陸資料的密碼
db 建立資料庫連線以後選擇的資料庫
port 連線資料庫連線的埠號 ,預設3306
unix_socket:UNIX socket的路徑
connect_timeout:連線超時時間
read_default_file 讀取Mysql的配置檔案中的配置進行連線
3.2Conection類的成員
通過正確的引數呼叫MySQLdb的connect函式,將會返回Connection類的物件。常用方法如下:
begin:開始事務
commit:提交事務
rollback:回滾事務
cursor:返回一個cursor物件
autocommint:設定事務是否自動提交
set_character_set:設定字符集編碼;
get_server_info:獲取資料庫版本資訊
3.3cusor類成員
cursor物件表示資料庫遊標,用於執行sql語句並獲取sql語句的執行結果。常用方法如下
execute:執行語句
close 關閉遊標
fetchall:獲取sql語句的所有記錄
fetchmany :獲取sql語句的多條記錄
fetchone:獲取sql語句的一條記錄
owncount:常量,表示sql語句的結果集中返回了多少條記錄
arraysize:變數,儲存了當前獲取記錄的下標
四、連線資料庫基本操作
4.1資料庫連線
import MySQLdb # 開啟資料庫連線 db = MySQLdb.connect('localhost','testuser','test123','TESTDB',charset='utf8') # 使用cursor()方法獲取操作遊標 cursor = db.cursor() # 使用execute方法執行SQL語句 cursor.execute('SELECT VERSION()') # 使用 fetchone() 方法獲取一條資料 data = cursor.fetchone() print "Database version : %s " % data # 關閉資料庫連線db.close() db.close()
執行完以上語句後,輸出結果如下
4.2建立資料庫表EMPLOYEE_1
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 開啟資料庫連線 db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) # 使用cursor()方法獲取操作遊標 cursor = db.cursor() # 如果資料表已經存在使用 execute() 方法刪除表。 #cursor.execute("DROP TABLE IF EXISTS EMPLOYEE_1") # 建立資料表SQL語句 sql = """CREATE TABLE EMPLOYEE_1 ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor.execute(sql) # 關閉資料庫連線 db.close()
此時查看錶已經被建立
4.3資料庫插入操作
以下為使用sql insert語句向表EMPLOYEE_1插入記錄:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 開啟資料庫連線 db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) # 使用cursor()方法獲取操作遊標 cursor = db.cursor() # SQL 插入語句 sql = "INSERT INTO EMPLOYEE_1(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ VALUES ('%s', '%s', '%d', '%c', '%d' )" % \ ('Mac', 'Mohan', 20, 'M', 2000) try: # 執行sql語句 cursor.execute(sql) # 提交到資料庫執行 db.commit() except: # 發生錯誤時回滾 db.rollback() # 關閉資料庫連線 db.close()
可以看到,資料已經插入了
4.4執行事務
事務機制可以確保資料一致性。
事務應該具有4個屬性:原子性、一致性、隔離性、永續性。這四個屬性通常稱為ACID特性。
原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。
一致性(consistency)。事務必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
永續性(durability)。持續性也稱永久性(permanence),指一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
Python DB API 2.0 的事務提供了兩個方法 commit 或 rollback。
# SQL刪除記錄語句 sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # 執行SQL語句 cursor.execute(sql) # 向資料庫提交 db.commit() except: # 發生錯誤時回滾 db.rollback()
4.5資料庫查詢操作
Python查詢Mysql使用 fetchone() 方法獲取單條資料, 使用fetchall() 方法獲取多條資料。
fetchone(): 該方法獲取下一個查詢結果集。結果集是一個物件
fetchall():接收全部的返回結果行.
rowcount: 這是一個只讀屬性,並返回執行execute()方法後影響的行數。
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 開啟資料庫連線 db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) # 使用cursor()方法獲取操作遊標 cursor = db.cursor() # SQL 查詢語句 sql = "SELECT * FROM EMPLOYEE_1 \ WHERE INCOME > '%d'" % (1000) try: # 執行SQL語句 cursor.execute(sql) # 獲取所有記錄列表 results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # 列印結果 print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \ (fname, lname, age, sex, income ) except: print "Error: unable to fecth data" # 關閉資料庫連線 db.close()
查詢EMPLOYEE_1表中salary(工資)欄位大於1000的所有資料:
4.5資料庫更新操作
新操作用於更新資料表的的資料,以下例項將 EMPLOYEE_1 表中的 SEX 欄位為 'M' 的 AGE 欄位遞增 1:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 開啟資料庫連線 db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' ) # 使用cursor()方法獲取操作遊標 cursor = db.cursor() # SQL 更新語句 sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # 執行SQL語句 cursor.execute(sql) # 提交到資料庫執行 db.commit() except: # 發生錯誤時回滾 db.rollback() # 關閉資料庫連線 db.close()
六、錯誤處理
以下為常見異常及解釋