前言
回顧之前講了python語法編程 ,必修入門基礎(chǔ)和網(wǎng)絡(luò)編程,多線程/多進(jìn)程/協(xié)程等方面的內(nèi)容,今天到了數(shù)據(jù)庫編程篇,前面沒看的也不用往前翻,系列文已經(jīng)整理好了:
1.跟我一起從零開始學(xué)python(一)編程語法必修
2.跟我一起從零開始學(xué)python(二)網(wǎng)絡(luò)編程
3.跟我一起從零開始學(xué)python(三)多線程/多進(jìn)程/協(xié)程
本篇講:python數(shù)據(jù)庫編程:MySQL數(shù)據(jù)庫
本系列文根據(jù)以下學(xué)習(xí)路線展開講述,由于內(nèi)容較多,:
從零開始學(xué)python到高級(jí)進(jìn)階路線圖

一丶MySQL數(shù)據(jù)庫
MySQL數(shù)據(jù)庫
一丶MySQL基礎(chǔ)
MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),是目前最流行的開源數(shù)據(jù)庫之一。Python可以通過MySQLdb、PyMySQL等模塊來連接和操作MySQL數(shù)據(jù)庫。
以下是Python連接MySQL數(shù)據(jù)庫的基本步驟:
安裝MySQLdb或PyMySQL模塊
pip install MySQLdb
或
pip install PyMySQL
導(dǎo)入模塊
import MySQLdb
或
import pymysql
連接數(shù)據(jù)庫
# MySQLdb模塊
conn = MySQLdb.connect(host='localhost', user='root', password='password', database='test', port=3306)
# PyMySQL模塊
conn = pymysql.connect(host='localhost', user='root', password='password', database='test', port=3306)
創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
執(zhí)行SQL語句
cursor.execute('SELECT * FROM table_name')
獲取查詢結(jié)果
result = cursor.fetchall()
關(guān)閉游標(biāo)和連接
cursor.close()
conn.close()
以上是Python連接MySQL數(shù)據(jù)庫的基本步驟,具體操作可以根據(jù)實(shí)際需求進(jìn)行調(diào)整。
2.在MySQL數(shù)據(jù)庫中,常見的數(shù)據(jù)類型包括:
數(shù)值類型:包括整型、浮點(diǎn)型、雙精度型等。
字符串類型:包括定長字符串、變長字符串、文本類型等。
日期和時(shí)間類型:包括日期、時(shí)間、日期時(shí)間等。
布爾類型:包括真和假兩種值。
二進(jìn)制類型:包括二進(jìn)制數(shù)據(jù)、圖像、音頻等。
枚舉類型:包括一組預(yù)定義的值。
集合類型:包括一組預(yù)定義的值,但可以選擇多個(gè)。
在Python中,可以使用MySQLdb或pymysql等庫來連接MySQL數(shù)據(jù)庫,并使用SQL語句來創(chuàng)建、修改、查詢和刪除數(shù)據(jù)表。在創(chuàng)建數(shù)據(jù)表時(shí),需要指定每個(gè)字段的數(shù)據(jù)類型,以確保數(shù)據(jù)的正確性和完整性。
3.在MySQL數(shù)據(jù)庫中,約束是用于限制表中數(shù)據(jù)的規(guī)則。以下是MySQL中常用的約束:
NOT NULL約束:該約束用于確保列中的值不為空。
UNIQUE約束:該約束用于確保列中的值是唯一的。
PRIMARY KEY約束:該約束用于將列設(shè)置為主鍵,確保每行數(shù)據(jù)都有唯一的標(biāo)識(shí)符。
FOREIGN KEY約束:該約束用于確保列中的值與另一個(gè)表中的值匹配,通常用于建立表之間的關(guān)系。
CHECK約束:該約束用于確保列中的值符合指定的條件。
DEFAULT約束:該約束用于在插入新行時(shí)為列提供默認(rèn)值。
例如,以下是一個(gè)包含約束的MySQL表的示例:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT CHECK (age >= 18),
email VARCHAR(50) UNIQUE,
major_id INT,
FOREIGN KEY (major_id) REFERENCES majors(id)
);
在上面的示例中,id列被設(shè)置為主鍵,確保每行數(shù)據(jù)都有唯一的標(biāo)識(shí)符。name列被設(shè)置為NOT NULL,確保該列中的值不為空。age列被設(shè)置為CHECK約束,確保該列中的值大于或等于18。email列被設(shè)置為UNIQUE約束,確保該列中的值是唯一的。major\_id列被設(shè)置為FOREIGN KEY約束,確保該列中的值與majors表中的id列匹配。
4.Python中操作MySQL數(shù)據(jù)庫需要使用到MySQLdb或者pymysql等第三方庫
下面介紹一些基本的數(shù)據(jù)庫操作。
- 連接數(shù)據(jù)庫
使用MySQLdb庫連接數(shù)據(jù)庫的代碼如下:
import MySQLdb
# 打開數(shù)據(jù)庫連接
db = MySQLdb.connect(host="localhost", user="root", passwd="password", db="test")
# 使用cursor()方法獲取操作游標(biāo)
cursor = db.cursor()
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
使用pymysql庫連接數(shù)據(jù)庫的代碼如下:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", passwd="password", db="test")
# 使用cursor()方法獲取操作游標(biāo)
cursor = db.cursor()
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
- 創(chuàng)建表
使用execute()方法執(zhí)行SQL語句來創(chuàng)建表,例如:
# 創(chuàng)建表
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
- 插入數(shù)據(jù)
使用execute()方法執(zhí)行SQL語句來插入數(shù)據(jù),例如:
# 插入數(shù)據(jù)
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
cursor.execute(sql)
- 查詢數(shù)據(jù)
使用execute()方法執(zhí)行SQL語句來查詢數(shù)據(jù),例如:
# 查詢數(shù)據(jù)
sql = "SELECT * FROM EMPLOYEE WHERE INCOME > %s" % (1000)
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))
- 更新數(shù)據(jù)
使用execute()方法執(zhí)行SQL語句來更新數(shù)據(jù),例如:
# 更新數(shù)據(jù)
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
cursor.execute(sql)
- 刪除數(shù)據(jù)
使用execute()方法執(zhí)行SQL語句來刪除數(shù)據(jù),例如:
# 刪除數(shù)據(jù)
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
cursor.execute(sql)
5.在MySQL中,數(shù)據(jù)表是存儲(chǔ)數(shù)據(jù)的基本單位
下面介紹一些常用的數(shù)據(jù)表操作。
- 創(chuàng)建數(shù)據(jù)表
創(chuàng)建數(shù)據(jù)表的語法如下:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
.....
);
其中,table\_name是要?jiǎng)?chuàng)建的數(shù)據(jù)表的名稱,column1、column2、column3等是數(shù)據(jù)表中的列名,datatype是列的數(shù)據(jù)類型。
例如,創(chuàng)建一個(gè)名為students的數(shù)據(jù)表,包含id、name、age三個(gè)列,數(shù)據(jù)類型分別為int、varchar(20)、int,可以使用以下語句:
CREATE TABLE students (
id int,
name varchar(20),
age int
);
- 插入數(shù)據(jù)
插入數(shù)據(jù)的語法如下:
INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
其中,table\_name是要插入數(shù)據(jù)的數(shù)據(jù)表的名稱,column1、column2、column3等是數(shù)據(jù)表中的列名,value1、value2、value3等是要插入的數(shù)據(jù)。
例如,向students數(shù)據(jù)表中插入一條數(shù)據(jù),id為1,name為"Tom",age為18,可以使用以下語句:
INSERT INTO students (id, name, age) VALUES (1, 'Tom', 18);
- 查詢數(shù)據(jù)
查詢數(shù)據(jù)的語法如下:
SELECT column1, column2, column3, ... FROM table_name WHERE condition;
其中,table\_name是要查詢數(shù)據(jù)的數(shù)據(jù)表的名稱,column1、column2、column3等是要查詢的列名,condition是查詢條件。
例如,查詢students數(shù)據(jù)表中所有數(shù)據(jù),可以使用以下語句:
SELECT * FROM students;
- 更新數(shù)據(jù)
更新數(shù)據(jù)的語法如下:
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
其中,table\_name是要更新數(shù)據(jù)的數(shù)據(jù)表的名稱,column1、column2等是要更新的列名,value1、value2等是要更新的值,condition是更新條件。
例如,將students數(shù)據(jù)表中id為1的記錄的age更新為20,可以使用以下語句:
UPDATE students SET age = 20 WHERE id = 1;
- 刪除數(shù)據(jù)
刪除數(shù)據(jù)的語法如下:
DELETE FROM table_name WHERE condition;
其中,table\_name是要?jiǎng)h除數(shù)據(jù)的數(shù)據(jù)表的名稱,condition是刪除條件。
例如,刪除students數(shù)據(jù)表中id為1的記錄,可以使用以下語句:
DELETE FROM students WHERE id = 1;
- 刪除數(shù)據(jù)表
刪除數(shù)據(jù)表的語法如下:
DROP TABLE table_name;
其中,table\_name是要?jiǎng)h除的數(shù)據(jù)表的名稱。
例如,刪除students數(shù)據(jù)表,可以使用以下語句:
DROP TABLE students;
6.Python操作MySQL數(shù)據(jù)庫的增刪改查基礎(chǔ)操作如下:
- 連接數(shù)據(jù)庫
使用Python中的pymysql庫連接MySQL數(shù)據(jù)庫,示例代碼如下:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", password="123456", database="test")
# 使用 cursor() 方法創(chuàng)建一個(gè)游標(biāo)對(duì)象 cursor
cursor = db.cursor()
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
- 創(chuàng)建數(shù)據(jù)表
使用Python中的pymysql庫創(chuàng)建MySQL數(shù)據(jù)庫中的數(shù)據(jù)表,示例代碼如下:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", password="123456", database="test")
# 使用 cursor() 方法創(chuàng)建一個(gè)游標(biāo)對(duì)象 cursor
cursor = db.cursor()
# 創(chuàng)建數(shù)據(jù)表SQL語句
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
# 執(zhí)行SQL語句
cursor.execute(sql)
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
- 插入數(shù)據(jù)
使用Python中的pymysql庫向MySQL數(shù)據(jù)庫中的數(shù)據(jù)表插入數(shù)據(jù),示例代碼如下:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", password="123456", database="test")
# 使用 cursor() 方法創(chuàng)建一個(gè)游標(biāo)對(duì)象 cursor
cursor = db.cursor()
# SQL 插入語句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
# 執(zhí)行SQL語句
cursor.execute(sql)
# 提交到數(shù)據(jù)庫執(zhí)行
db.commit()
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
- 查詢數(shù)據(jù)
使用Python中的pymysql庫從MySQL數(shù)據(jù)庫中的數(shù)據(jù)表查詢數(shù)據(jù),示例代碼如下:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", password="123456", database="test")
# 使用 cursor() 方法創(chuàng)建一個(gè)游標(biāo)對(duì)象 cursor
cursor = db.cursor()
# SQL 查詢語句
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > %s" % (1000)
# 執(zhí)行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]
# 打印結(jié)果
print("fname=%s,lname=%s,age=%d,sex=%s,income=%d" % (fname, lname, age, sex, income))
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
- 更新數(shù)據(jù)
使用Python中的pymysql庫更新MySQL數(shù)據(jù)庫中的數(shù)據(jù)表數(shù)據(jù),示例代碼如下:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", password="123456", database="test")
# 使用 cursor() 方法創(chuàng)建一個(gè)游標(biāo)對(duì)象 cursor
cursor = db.cursor()
# SQL 更新語句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
# 執(zhí)行SQL語句
cursor.execute(sql)
# 提交到數(shù)據(jù)庫執(zhí)行
db.commit()
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
- 刪除數(shù)據(jù)
使用Python中的pymysql庫刪除MySQL數(shù)據(jù)庫中的數(shù)據(jù)表數(shù)據(jù),示例代碼如下:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", password="123456", database="test")
# 使用 cursor() 方法創(chuàng)建一個(gè)游標(biāo)對(duì)象 cursor
cursor = db.cursor()
# SQL 刪除語句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
# 執(zhí)行SQL語句
cursor.execute(sql)
# 提交到數(shù)據(jù)庫執(zhí)行
db.commit()
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
二丶MySQL進(jìn)階查詢
1.創(chuàng)建數(shù)據(jù)庫,數(shù)據(jù)表
- 創(chuàng)建數(shù)據(jù)庫:
使用Python連接MySQL數(shù)據(jù)庫,可以使用mysql.connector模塊,示例代碼如下:
import mysql.connector
# 連接MySQL數(shù)據(jù)庫
mydb = mysql.connector.connect(
host="localhost",
user="root",
password="123456"
)
# 創(chuàng)建數(shù)據(jù)庫
mycursor = mydb.cursor()
mycursor.execute("CREATE DATABASE mydatabase")
- 創(chuàng)建數(shù)據(jù)表:
使用Python連接MySQL數(shù)據(jù)庫,可以使用mysql.connector模塊,示例代碼如下:
import mysql.connector
# 連接MySQL數(shù)據(jù)庫
mydb = mysql.connector.connect(
host="localhost",
user="root",
password="123456",
database="mydatabase"
)
# 創(chuàng)建數(shù)據(jù)表
mycursor = mydb.cursor()
mycursor.execute("CREATE TABLE customers (name VARCHAR(255), address VARCHAR(255))")
以上代碼創(chuàng)建了一個(gè)名為customers的數(shù)據(jù)表,包含兩個(gè)字段name和address,類型均為VARCHAR(255)
2.條件查詢
條件查詢是指根據(jù)一定的條件篩選出符合要求的數(shù)據(jù),常用的條件查詢語句有WHERE、AND、OR、IN、BETWEEN等。
- WHERE語句
WHERE語句用于指定查詢條件,語法如下:
SELECT column1, column2, ... FROM table_name WHERE condition;
其中,condition是查詢條件,可以使用比較運(yùn)算符(=、<、>、<=、>=、<>)、邏輯運(yùn)算符(AND、OR、NOT)和通配符(%、_)等。
例如,查詢年齡大于等于18歲的學(xué)生信息:
SELECT * FROM students WHERE age >= 18;
- AND語句
AND語句用于同時(shí)滿足多個(gè)條件,語法如下:
SELECT column1, column2, ... FROM table_name WHERE condition1 AND condition2 AND ...;
例如,查詢年齡大于等于18歲且性別為女的學(xué)生信息:
SELECT * FROM students WHERE age >= 18 AND gender = '女';
- OR語句
OR語句用于滿足多個(gè)條件中的任意一個(gè),語法如下:
SELECT column1, column2, ... FROM table_name WHERE condition1 OR condition2 OR ...;
例如,查詢年齡大于等于18歲或性別為女的學(xué)生信息:
SELECT * FROM students WHERE age >= 18 OR gender = '女';
- IN語句
IN語句用于指定多個(gè)值,語法如下:
SELECT column1, column2, ... FROM table_name WHERE column_name IN (value1, value2, ...);
例如,查詢學(xué)號(hào)為1001、1002、1003的學(xué)生信息:
SELECT * FROM students WHERE id IN (1001, 1002, 1003);
- BETWEEN語句
BETWEEN語句用于指定一個(gè)范圍,語法如下:
SELECT column1, column2, ... FROM table_name WHERE column_name BETWEEN value1 AND value2;
例如,查詢年齡在18歲到20歲之間的學(xué)生信息:
SELECT * FROM students WHERE age BETWEEN 18 AND 20;
以上就是條件查詢的基本語法,可以根據(jù)實(shí)際需求靈活運(yùn)用。
3.在MySQL中,可以使用ORDER BY子句對(duì)查詢結(jié)果進(jìn)行排序
ORDER BY子句可以跟一個(gè)或多個(gè)列名,用逗號(hào)分隔。默認(rèn)情況下,排序是升序的,可以使用DESC關(guān)鍵字進(jìn)行降序排序。
例如,以下語句將按照age列進(jìn)行升序排序:
SELECT * FROM students ORDER BY age;
以下語句將按照age列進(jìn)行降序排序:
SELECT * FROM students ORDER BY age DESC;
可以同時(shí)指定多個(gè)列進(jìn)行排序,例如:
SELECT * FROM students ORDER BY grade DESC, age;
以上語句將先按照grade列進(jìn)行降序排序,如果有相同的grade值,則按照age列進(jìn)行升序排序。
注意,ORDER BY子句應(yīng)該放在查詢語句的最后面。
4.在MySQL中,分組是一種將數(shù)據(jù)按照某個(gè)字段進(jìn)行分類的操作
分組可以用于統(tǒng)計(jì)數(shù)據(jù)、計(jì)算平均值、最大值、最小值等聚合函數(shù)的值。
下面是一個(gè)簡(jiǎn)單的例子,假設(shè)我們有一個(gè)學(xué)生表,包含學(xué)生的姓名、年齡和成績:
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
score INT
);
INSERT INTO students (name, age, score) VALUES
('Tom', 18, 90),
('Jerry', 19, 80),
('Lucy', 18, 95),
('Lily', 20, 85),
('Bob', 19, 75);
現(xiàn)在我們想要按照年齡分組,統(tǒng)計(jì)每個(gè)年齡段的平均成績和最高成績,可以使用如下的SQL語句:
SELECT age, AVG(score) AS avg_score, MAX(score) AS max_score
FROM students
GROUP BY age;
執(zhí)行結(jié)果如下:
+-----+-----------+----------+
| age | avg_score | max_score |
+-----+-----------+----------+
| 18 | 92.5000 | 95 |
| 19 | 77.5000 | 80 |
| 20 | 85.0000 | 85 |
+-----+-----------+----------+
可以看到,我們按照年齡分組,統(tǒng)計(jì)了每個(gè)年齡段的平均成績和最高成績。
在分組查詢中,我們還可以使用HAVING子句來過濾分組后的數(shù)據(jù)。例如,我們想要找出平均成績大于85分的年齡段,可以使用如下的SQL語句:
SELECT age, AVG(score) AS avg_score
FROM students
GROUP BY age
HAVING avg_score > 85;
執(zhí)行結(jié)果如下:
+-----+-----------+
| age | avg_score |
+-----+-----------+
| 18 | 92.5000 |
| 20 | 85.0000 |
+-----+-----------+
可以看到,我們只保留了平均成績大于85分的年齡段。
三丶MySQL高級(jí)應(yīng)用
1.視圖
在MySQL中,視圖是一種虛擬的表,它是由一個(gè)或多個(gè)基本表的查詢結(jié)果組成的。視圖并不存儲(chǔ)數(shù)據(jù),而是根據(jù)查詢語句動(dòng)態(tài)生成結(jié)果集。視圖可以簡(jiǎn)化復(fù)雜的查詢操作,提高查詢效率,同時(shí)也可以保護(hù)數(shù)據(jù)的安全性。
創(chuàng)建視圖的語法如下:
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
其中,view_name是視圖的名稱,column1, column2, ...是要查詢的列名,table_name是要查詢的表名,condition是查詢條件。
例如,我們可以創(chuàng)建一個(gè)名為employee_view的視圖,查詢employee表中的id、name和salary列:
CREATE VIEW employee_view AS
SELECT id, name, salary
FROM employee;
查詢視圖的語法與查詢表的語法類似:
SELECT * FROM view_name;
例如,我們可以查詢employee_view視圖的結(jié)果:
SELECT * FROM employee_view;
視圖也可以進(jìn)行更新操作,但是需要滿足一定的條件。具體來說,視圖可以進(jìn)行以下類型的更新操作:
- 對(duì)單表視圖進(jìn)行更新,即只涉及一個(gè)基本表的視圖。
- 對(duì)多表視圖進(jìn)行更新,但是更新操作只能涉及一個(gè)基本表的某些列,且這些列必須是唯一的。
更新視圖的語法如下:
UPDATE view_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
例如,我們可以更新employee_view視圖中id為1的員工的薪水:
UPDATE employee_view
SET salary = 5000
WHERE id = 1;
需要注意的是,更新視圖時(shí),實(shí)際上是更新了基本表中的數(shù)據(jù),而不是視圖本身。因此,更新視圖時(shí)需要滿足基本表的約束條件,否則會(huì)更新失敗。
除了更新操作,視圖還可以進(jìn)行插入和刪除操作,具體語法與表的操作類似。但是需要注意的是,插入和刪除操作只能涉及一個(gè)基本表,且必須滿足基本表的約束條件。
2.事務(wù)
事務(wù)是指一組操作,這些操作要么全部執(zhí)行成功,要么全部不執(zhí)行。在 MySQL 中,事務(wù)是通過 ACID 屬性來保證數(shù)據(jù)的一致性和可靠性的。
ACID 是指:
- 原子性(Atomicity):事務(wù)中的所有操作要么全部執(zhí)行成功,要么全部不執(zhí)行。
- 一致性(Consistency):事務(wù)執(zhí)行前后,數(shù)據(jù)的完整性和約束條件不變。
- 隔離性(Isolation):事務(wù)之間是相互隔離的,一個(gè)事務(wù)的執(zhí)行不會(huì)影響其他事務(wù)的執(zhí)行。
- 持久性(Durability):事務(wù)一旦提交,對(duì)數(shù)據(jù)的修改就是永久性的,即使系統(tǒng)崩潰也不會(huì)丟失。
在 MySQL 中,使用 BEGIN、COMMIT 和 ROLLBACK 語句來控制事務(wù)的提交和回滾。
- BEGIN:開始一個(gè)事務(wù)。
- COMMIT:提交一個(gè)事務(wù),將事務(wù)中的所有操作永久保存到數(shù)據(jù)庫中。
-
ROLLBACK:回滾一個(gè)事務(wù),將事務(wù)中的所有操作撤銷。
下面是一個(gè)使用事務(wù)的示例:
import mysql.connector
# 連接數(shù)據(jù)庫
mydb = mysql.connector.connect(
host="localhost",
user="root",
password="123456",
database="mydatabase"
)
# 獲取游標(biāo)
mycursor = mydb.cursor()
# 開始事務(wù)
mycursor.execute("START TRANSACTION")
# 執(zhí)行操作
try:
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("John", "Highway 21")
mycursor.execute(sql, val)
sql = "UPDATE customers SET address = 'Park Lane 38' WHERE address = 'Highway 21'"
mycursor.execute(sql)
# 提交事務(wù)
mydb.commit()
except:
# 回滾事務(wù)
mydb.rollback()
# 關(guān)閉連接
mydb.close()
在上面的示例中,我們使用了 START TRANSACTION 開始一個(gè)事務(wù),然后執(zhí)行了兩個(gè)操作:插入一條數(shù)據(jù)和更新一條數(shù)據(jù)。如果兩個(gè)操作都執(zhí)行成功,就使用 COMMIT 提交事務(wù),否則就使用 ROLLBACK 回滾事務(wù)。
3.pyMySQL的使用
pyMySQL是Python中一個(gè)用于連接MySQL數(shù)據(jù)庫的第三方庫,它提供了一些簡(jiǎn)單易用的API,可以方便地進(jìn)行數(shù)據(jù)庫操作。
- 安裝pyMySQL:
可以使用pip命令進(jìn)行安裝:
pip install pymysql
- 連接MySQL數(shù)據(jù)庫:
在使用pyMySQL之前,需要先連接到MySQL數(shù)據(jù)庫。連接MySQL數(shù)據(jù)庫需要指定主機(jī)名、用戶名、密碼、數(shù)據(jù)庫名等信息??梢允褂靡韵麓a進(jìn)行連接:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", password="password", database="test")
# 使用cursor()方法獲取操作游標(biāo)
cursor = db.cursor()
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
其中,host表示主機(jī)名,user表示用戶名,password表示密碼,database表示要連接的數(shù)據(jù)庫名。
- 執(zhí)行SQL語句:
連接到MySQL數(shù)據(jù)庫后,可以使用cursor對(duì)象執(zhí)行SQL語句。pyMySQL支持執(zhí)行所有的SQL語句,包括查詢、插入、更新、刪除等操作。以下是一個(gè)查詢操作的示例:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", password="password", database="test")
# 使用cursor()方法獲取操作游標(biāo)
cursor = db.cursor()
# 執(zhí)行SQL語句
sql = "SELECT * FROM students"
cursor.execute(sql)
# 獲取所有記錄列表
results = cursor.fetchall()
for row in results:
id = row[0]
name = row[1]
age = row[2]
gender = row[3]
print("id=%d,name=%s,age=%d,gender=%s" % (id, name, age, gender))
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
在執(zhí)行SQL語句之前,需要先使用cursor()方法獲取操作游標(biāo)。執(zhí)行SQL語句可以使用execute()方法,該方法接受一個(gè)SQL語句作為參數(shù)。查詢操作可以使用fetchall()方法獲取所有記錄列表,然后遍歷每一條記錄。
插入、更新、刪除操作也可以使用execute()方法,只需要將對(duì)應(yīng)的SQL語句作為參數(shù)傳入即可。
以上是pyMySQL的基本使用方法,更多詳細(xì)的API可以參考官方文檔。
四丶MySQL ORM框架-SQLAIchemy
SQLAlchemy是一個(gè)Python SQL工具包和ORM框架,它提供了一組廣泛的工具,使得在Python中使用SQL更加容易和靈活。SQLAlchemy的主要目標(biāo)是為SQL數(shù)據(jù)庫提供高效、高性能的訪問,并支持多種關(guān)系型數(shù)據(jù)庫,如MySQL、PostgreSQL、Oracle、Microsoft SQL Server等。
SQLAlchemy的ORM框架提供了一種將Python對(duì)象映射到關(guān)系型數(shù)據(jù)庫表的方法,使得開發(fā)人員可以使用Python語言來操作數(shù)據(jù)庫,而不必直接使用SQL語言。ORM框架可以自動(dòng)創(chuàng)建數(shù)據(jù)庫表、插入數(shù)據(jù)、更新數(shù)據(jù)、刪除數(shù)據(jù)等操作,同時(shí)還支持事務(wù)、連接池、緩存等高級(jí)功能。
下面是一個(gè)使用SQLAlchemy ORM框架的示例:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 創(chuàng)建數(shù)據(jù)庫連接
engine = create_engine('mysql+pymysql://username:password@host:port/database')
# 創(chuàng)建Session類
Session = sessionmaker(bind=engine)
# 創(chuàng)建Base類
Base = declarative_base()
# 定義User類
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
age = Column(Integer)
# 創(chuàng)建表
Base.metadata.create_all(engine)
# 創(chuàng)建Session實(shí)例
session = Session()
# 插入數(shù)據(jù)
user = User(name='Tom', age=20)
session.add(user)
session.commit()
# 查詢數(shù)據(jù)
users = session.query(User).all()
for user in users:
print(user.name, user.age)
# 更新數(shù)據(jù)
user = session.query(User).filter_by(name='Tom').first()
user.age = 21
session.commit()
# 刪除數(shù)據(jù)
user = session.query(User).filter_by(name='Tom').first()
session.delete(user)
session.commit()
# 關(guān)閉Session
session.close()
在上面的示例中,我們首先創(chuàng)建了一個(gè)數(shù)據(jù)庫連接,然后創(chuàng)建了一個(gè)Session類和一個(gè)Base類。Session類用于創(chuàng)建Session實(shí)例,Base類用于定義ORM映射關(guān)系。我們定義了一個(gè)User類,它繼承自Base類,并定義了表名和字段。然后我們使用Base.metadata.create_all()方法創(chuàng)建了表。接著我們創(chuàng)建了一個(gè)Session實(shí)例,并使用session.add()方法插入了一條數(shù)據(jù)。使用session.query()方法查詢數(shù)據(jù),并使用session.commit()方法提交事務(wù)。我們還演示了如何更新和刪除數(shù)據(jù),最后使用session.close()方法關(guān)閉Session。
SQLAlchemy ORM框架提供了豐富的功能和靈活的配置選項(xiàng),可以滿足各種不同的需求。同時(shí),它也有一定的學(xué)習(xí)曲線,需要花費(fèi)一些時(shí)間來學(xué)習(xí)和掌握。
1.使用SQLAlchemy查詢MySQL數(shù)據(jù)庫的示例
首先,需要安裝SQLAlchemy庫:
pip install sqlalchemy
然后,連接MySQL數(shù)據(jù)庫:
from sqlalchemy import create_engine
# 連接MySQL數(shù)據(jù)庫
engine = create_engine('mysql+pymysql://username:password@host:port/database')
其中,username和password是MySQL數(shù)據(jù)庫的用戶名和密碼,host是MySQL數(shù)據(jù)庫的主機(jī)名,port是MySQL數(shù)據(jù)庫的端口號(hào),database是要連接的數(shù)據(jù)庫名。
接下來,定義一個(gè)ORM模型:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
# 定義ORM模型
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
age = Column(Integer)
這個(gè)ORM模型對(duì)應(yīng)MySQL數(shù)據(jù)庫中的users表,包含id、name和age三個(gè)字段。
接下來,使用SQLAlchemy查詢數(shù)據(jù):
from sqlalchemy.orm import sessionmaker
# 創(chuàng)建Session
Session = sessionmaker(bind=engine)
session = Session()
# 查詢所有用戶
users = session.query(User).all()
for user in users:
print(user.id, user.name, user.age)
# 查詢年齡大于等于18歲的用戶
users = session.query(User).filter(User.age >= 18).all()
for user in users:
print(user.id, user.name, user.age)
# 查詢年齡大于等于18歲的用戶,并按照年齡從小到大排序
users = session.query(User).filter(User.age >= 18).order_by(User.age).all()
for user in users:
print(user.id, user.name, user.age)
以上代碼分別查詢了所有用戶、年齡大于等于18歲的用戶、年齡大于等于18歲的用戶并按照年齡從小到大排序的結(jié)果,并打印出來。
除了以上示例,SQLAlchemy還支持更多的查詢方式,如分頁查詢、聚合查詢等。
以上就是關(guān)于python數(shù)據(jù)庫編程MySQL數(shù)據(jù)庫的內(nèi)容分析
本系列文根據(jù)以下學(xué)習(xí)路線展開講述,由于內(nèi)容較多,:
從零開始學(xué)python到高級(jí)進(jìn)階路線圖

下章講:Redis數(shù)據(jù)庫