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