寫這篇文章主要是為了介紹Python
操作MySQL
數(shù)據(jù)庫,并結合相應的實例帶你更加深入了解。文中的代碼實例很詳細,對大家有一定的參考學習價值。
1.什么是pymysql?
PyMySQL
是在Python3.x
版本中用于連接MySQL
服務器的一個庫,Python2
中使用mysqldb
。PyMySql
遵循Python數(shù)據(jù)庫API v2.0
的規(guī)范,并包含了pure-Python MySQL
客戶端庫。
2.安裝PyMySQL
$ pip install pymysql
3.MySQL數(shù)據(jù)庫安裝與配置
在用PyMySQL
連接MySQL
數(shù)據(jù)庫之前,請確保MySQL
數(shù)據(jù)庫安裝配置完成,具體如何安裝與配置MySQL
數(shù)據(jù)庫,請參考 MySQL 安裝 和 MySQL 管理。
4.1.連接數(shù)據(jù)庫操作
import pymysql
# 數(shù)據(jù)庫服務器名
HOSTNAME = 'node05'
# 數(shù)據(jù)庫用戶名
USER = 'root'
# 數(shù)據(jù)庫名
DATABASE = 'cayman'
# 數(shù)據(jù)庫密碼
PASSWORD = 'Love88me'
# 打開數(shù)據(jù)庫連接
conn = pymysql.connect(HOSTNAME, USER, PASSWORD, DATABASE)
# 使用cursor()方法創(chuàng)建一個游標對象
cursor = conn.cursor()
# 使用execute()方法執(zhí)行SQL查詢語句
cursor.execute("select VERSION()")
# 使用fetchone()查詢單條數(shù)據(jù)
data = cursor.fetchone()
print(f"Database Version: {data}")
# 關閉數(shù)據(jù)庫連接
conn.close()
4.2.創(chuàng)建表操作
import pymysql
# 設置數(shù)據(jù)庫配置項
HOSTNAME = 'node05'
USERNAME = 'root'
PASSWORD = 'Love88me'
DATABASE = 'cayman'
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(HOSTNAME, USERNAME, PASSWORD, DATABASE)
# 使用cursor對象創(chuàng)建一個流標對象
cursor = db.cursor()
# 使用execute()方法執(zhí)行SQL, 如果表存在則刪除
cursor.execute("DROP TABLE IF EXISTS employee")
# 使用預處理語句創(chuàng)建表
sql = """ CREATE TABLE employee(
id bigint primary key auto_increment,
user_name varchar(50) not null,
age int,
sex char(1),
income float
)
"""
# 執(zhí)行sql語句
cursor.execute(sql)
# 關閉數(shù)據(jù)庫連接
db.close()
4.3.1.數(shù)據(jù)庫插入單條語句
import pymysql
# 設置數(shù)據(jù)庫配置項
HOSTNAME = 'node05'
USERNAME = 'root'
PASSWORD = 'Love88me'
DATABASE = 'cayman'
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(HOSTNAME, USERNAME, PASSWORD, DATABASE)
# 使用cursor對象創(chuàng)建一個流標對象
cursor = db.cursor()
# SQL語句
sql = """
insert into employee(user_name, age, sex, income) values ('風清揚', 64, '男', 22000);
"""
try:
# 執(zhí)行sql語句
cursor.execute(sql)
# 提交
db.commit()
except:
# 如果發(fā)生錯誤就回滾
db.rollback()
# 關閉數(shù)據(jù)庫連接
db.close()
4.3.2.數(shù)據(jù)庫插入多條語句
import pymysql
# 設置數(shù)據(jù)庫配置項
HOSTNAME = 'node05'
USERNAME = 'root'
PASSWORD = 'Love88me'
DATABASE = 'cayman'
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(HOSTNAME, USERNAME, PASSWORD, DATABASE)
# 使用cursor對象創(chuàng)建一個流標對象
cursor = db.cursor()
# SQL語句
sql = " insert into employee(user_name, age, sex, income) values (%s, %s, %s, %s)"
data = (
('風清揚', 64, '男', 22000),
('令狐沖', 22, '男', 14000),
('任盈盈', 20, '男', 10000),
('東方不敗', 32, '男', 18000),
('任我行', 56, '男', 17000),
('段譽', 33, '男', 19000),
('王語嫣', 26, '女', 9000),
('木婉清', 23, '女', 6000),
('喬峰', 38, '男', 23000),
('阿朱', 24, '女', 5000),
('阿紫', 22, '女', 5500),
('虛竹', 35, '男', 11000),
('夢姑', 25, '女', 6500),
('梅超風', 41, '女', 15000),
('陳玄風', 44, '男', 12000),
('楊過', 28, '男', 24000),
('小龍女', 38, '女', 15000),
('鳩摩智', 44, '男', 16000)
)
try:
# 執(zhí)行sql語句
cursor.executemany(sql, data)
# 提交
db.commit()
except:
# 如果發(fā)生錯誤就回滾
db.rollback()
# 關閉數(shù)據(jù)庫連接
db.close()
4.4.數(shù)據(jù)庫查詢
Python
查詢MySQL
使用fetchone()
獲取單條數(shù)據(jù),使用fetchall()
方法獲取多條數(shù)據(jù)。
- fetchone(): 該方法獲取下一個查詢結果集。結果集是一個對象
- fetchall(): 接收全部的返回結果行;
- rowcount(): 這是一個只讀屬性,并返回執(zhí)行execute()方法后影響的行數(shù)。
4.4.1.查詢示例
查詢employee
表中income
(工資)大于20000的所有數(shù)據(jù)
# 1.查詢employee表中工資大于20000的員工信息
import pymysql
# 設置數(shù)據(jù)庫配置項
HOSTNAME = 'node05'
USERNAME = 'root'
PASSWORD = 'Love88me'
DATABASE = 'cayman'
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(HOSTNAME, USERNAME, PASSWORD, DATABASE)
# 使用cursor對象創(chuàng)建一個流標對象
cursor = db.cursor()
# 查詢語句
sql = "select * from employee where income >'%d' "%(20000)
try:
# 執(zhí)行sql語句
cursor.execute(sql)
# 獲取所有滿足條件的列表
ret = cursor.fetchall()
# 遍歷打印結果
for row in ret:
user_name = row[1]
age = row[2]
sex = row[3]
income = row[4]
print(f"員工: {user_name},年齡: {age}, 性別: {sex}, 工資: {income}")
except:
print("無滿足條件的數(shù)據(jù)或查詢出錯!!")
# 關閉數(shù)據(jù)庫連接
db.close()
4.5.數(shù)據(jù)庫更新操作
import pymysql
# 設置數(shù)據(jù)庫配置項
HOSTNAME = 'node05'
USERNAME = 'root'
PASSWORD = 'Love88me'
DATABASE = 'cayman'
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(HOSTNAME, USERNAME, PASSWORD, DATABASE)
# 使用cursor對象創(chuàng)建一個流標對象
cursor = db.cursor()
# 更新語句
sql = "update employee set income=income+income*0.1 where sex='%c'"%('女')
try:
# 執(zhí)行SQL語句
cursor.execute(sql)
# 提交
db.commit()
except:
# 發(fā)生錯誤時回滾
db.rollback()
# 關閉數(shù)據(jù)庫
db.close()
4.6.刪除操作
import pymysql
# 設置數(shù)據(jù)庫連接信息
HOSTNAME = 'node05'
USERNAME = 'root'
PASSWORD = 'Love88me'
DATABASE = 'cayman'
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(HOSTNAME, USERNAME, PASSWORD, DATABASE)
# 使用cursor()方法獲取游標
cursor = db.cursor()
# 構建刪除數(shù)據(jù)SQL語句
sql = "delete from employee where user_name = '%s'"%('鳩摩智')
try:
# 執(zhí)行sql語句
cursor.execute(sql)
# 提交
db.commit()
except:
# 發(fā)生異常時回滾
db.rollback()
# 關閉數(shù)據(jù)庫連接
db.close()
4.7 執(zhí)行事務操作
在數(shù)據(jù)庫操作中,事務機制可以保證數(shù)據(jù)的一致性。最基本的事務應當具備4個屬性: 原子性、一致性、隔離性、和持久性。這四個屬性被稱作ACID
特性。
- 原子性(Atomicity): 一個事務是一個不可分割的工作單位,事務中包括的諸操作要么都做,要么都不做。
- 一致性(Consistency): 事務必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。一致性與原子性是密切相關的。
- 隔離性(Isolation): 一個事務的執(zhí)行不能被其他事務干擾。即一個事務內部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務是隔離的,并發(fā)執(zhí)行的各個事務之間不能互相干擾。
- 持久性(Durability): 持續(xù)性也稱永久性(permanence),指一個事務一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
Python DB API 2.0
的事務提供了兩個方法commit
和rollback
。對于支持事務的數(shù)據(jù)庫編程中,當流標建立時,就自動開啟了一個隱形的數(shù)據(jù)庫事務。
4.8 錯誤處理
DB API
中定義了一些數(shù)據(jù)庫操作的錯誤及異常,下表列出了這些錯誤和異常:
以上就是關于Python
操作MySQL
數(shù)據(jù)庫的講解了,希望對大家有所幫助,或許同學們也可以進入以下教程學習一下
python教程:http://o2fo.com/python/
python3基礎微課:http://o2fo.com/minicourse/play/python3course