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