App下載

帶你了解什么是Python操作MySQL數(shù)據(jù)庫(kù)

猿友 2020-07-29 14:39:01 瀏覽數(shù) (6472)
反饋

寫這篇文章主要是為了介紹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è)方法commitrollback。對(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ò)誤和異常:

MySQL錯(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

1 人點(diǎn)贊