1. 程式人生 > >python學習-使用MySQLdb操作mysql資料庫

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;

image.png


建立資料庫使用者

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;

image.png

驗證是否能偶遠端登陸

image.png

至此,資料庫準備完畢

三、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()

執行完以上語句後,輸出結果如下

image.png


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()

此時查看錶已經被建立

image.png


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()

可以看到,資料已經插入了

image.png




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的所有資料:

image.png


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()


六、錯誤處理


以下為常見異常及解釋

image.png