前言
回顧之前講了python語法編程 谍婉,必修入門基礎和網(wǎng)絡編程彪腔,多線程/多進程/協(xié)程等方面的內容攒钳,今天到了數(shù)據(jù)庫編程篇,前面沒看的也不用往前翻香浩,系列文已經(jīng)整理好了:
1.跟我一起從零開始學python(一)編程語法必修
2.跟我一起從零開始學python(二)網(wǎng)絡編程
3.跟我一起從零開始學python(三)多線程/多進程/協(xié)程
本篇講:python數(shù)據(jù)庫編程:MySQL數(shù)據(jù)庫
本系列文根據(jù)以下學習路線展開講述类缤,由于內容較多,:
一丶MySQL數(shù)據(jù)庫
MySQL數(shù)據(jù)庫
一丶MySQL基礎
MySQL是一種關系型數(shù)據(jù)庫管理系統(tǒng)邻吭,是目前最流行的開源數(shù)據(jù)庫之一餐弱。Python可以通過MySQLdb、PyMySQL等模塊來連接和操作MySQL數(shù)據(jù)庫。
以下是Python連接MySQL數(shù)據(jù)庫的基本步驟:
安裝MySQLdb或PyMySQL模塊
pip install MySQLdb
或
pip install PyMySQL
導入模塊
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)建游標對象
cursor = conn.cursor()
執(zhí)行SQL語句
cursor.execute('SELECT * FROM table_name')
獲取查詢結果
result = cursor.fetchall()
關閉游標和連接
cursor.close()
conn.close()
以上是Python連接MySQL數(shù)據(jù)庫的基本步驟膏蚓,具體操作可以根據(jù)實際需求進行調整崩哩。
2.在MySQL數(shù)據(jù)庫中换帜,常見的數(shù)據(jù)類型包括:
數(shù)值類型:包括整型肤频、浮點型击喂、雙精度型等。
字符串類型:包括定長字符串剧董、變長字符串幢尚、文本類型等。
日期和時間類型:包括日期翅楼、時間、日期時間等真慢。
布爾類型:包括真和假兩種值毅臊。
二進制類型:包括二進制數(shù)據(jù)、圖像黑界、音頻等管嬉。
枚舉類型:包括一組預定義的值。
集合類型:包括一組預定義的值朗鸠,但可以選擇多個蚯撩。
在Python中,可以使用MySQLdb或pymysql等庫來連接MySQL數(shù)據(jù)庫烛占,并使用SQL語句來創(chuàng)建胎挎、修改、查詢和刪除數(shù)據(jù)表忆家。在創(chuàng)建數(shù)據(jù)表時犹菇,需要指定每個字段的數(shù)據(jù)類型,以確保數(shù)據(jù)的正確性和完整性芽卿。
3.在MySQL數(shù)據(jù)庫中揭芍,約束是用于限制表中數(shù)據(jù)的規(guī)則。以下是MySQL中常用的約束:
NOT NULL約束:該約束用于確保列中的值不為空卸例。
UNIQUE約束:該約束用于確保列中的值是唯一的称杨。
PRIMARY KEY約束:該約束用于將列設置為主鍵,確保每行數(shù)據(jù)都有唯一的標識符筷转。
FOREIGN KEY約束:該約束用于確保列中的值與另一個表中的值匹配姑原,通常用于建立表之間的關系。
CHECK約束:該約束用于確保列中的值符合指定的條件旦装。
DEFAULT約束:該約束用于在插入新行時為列提供默認值页衙。
例如,以下是一個包含約束的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ù)據(jù)都有唯一的標識符艰躺。name列被設置為NOT NULL,確保該列中的值不為空眨八。age列被設置為CHECK約束腺兴,確保該列中的值大于或等于18。email列被設置為UNIQUE約束廉侧,確保該列中的值是唯一的页响。major\_id
列被設置為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()方法獲取操作游標
cursor = db.cursor()
# 關閉數(shù)據(jù)庫連接
db.close()
使用pymysql庫連接數(shù)據(jù)庫的代碼如下:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", passwd="password", db="test")
# 使用cursor()方法獲取操作游標
cursor = db.cursor()
# 關閉數(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ù)表是存儲數(shù)據(jù)的基本單位
下面介紹一些常用的數(shù)據(jù)表操作。
- 創(chuàng)建數(shù)據(jù)表
創(chuàng)建數(shù)據(jù)表的語法如下:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
.....
);
其中潜腻,table\_name
是要創(chuàng)建的數(shù)據(jù)表的名稱埃儿,column1、column2融涣、column3等是數(shù)據(jù)表中的列名童番,datatype是列的數(shù)據(jù)類型。
例如暴心,創(chuàng)建一個名為students的數(shù)據(jù)表妓盲,包含id、name专普、age三個列悯衬,數(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\_nam
e是要更新數(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
是要刪除數(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
是要刪除的數(shù)據(jù)表的名稱。
例如滑沧,刪除students數(shù)據(jù)表并村,可以使用以下語句:
DROP TABLE students;
6.Python操作MySQL數(shù)據(jù)庫的增刪改查基礎操作如下:
- 連接數(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)建一個游標對象 cursor
cursor = db.cursor()
# 關閉數(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)建一個游標對象 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)
# 關閉數(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)建一個游標對象 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()
# 關閉數(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)建一個游標對象 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]
# 打印結果
print("fname=%s,lname=%s,age=%d,sex=%s,income=%d" % (fname, lname, age, sex, income))
# 關閉數(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)建一個游標對象 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()
# 關閉數(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)建一個游標對象 cursor
cursor = db.cursor()
# SQL 刪除語句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
# 執(zhí)行SQL語句
cursor.execute(sql)
# 提交到數(shù)據(jù)庫執(zhí)行
db.commit()
# 關閉數(shù)據(jù)庫連接
db.close()
二丶MySQL進階查詢
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)建了一個名為customers
的數(shù)據(jù)表处窥,包含兩個字段name
和address
嘱吗,類型均為VARCHAR(255)
2.條件查詢
條件查詢是指根據(jù)一定的條件篩選出符合要求的數(shù)據(jù),常用的條件查詢語句有WHERE滔驾、AND谒麦、OR、IN哆致、BETWEEN等绕德。
- WHERE語句
WHERE語句用于指定查詢條件,語法如下:
SELECT column1, column2, ... FROM table_name WHERE condition;
其中摊阀,condition是查詢條件耻蛇,可以使用比較運算符(=、<胞此、>臣咖、<=、>=漱牵、<>)夺蛇、邏輯運算符(AND、OR酣胀、NOT)和通配符(%刁赦、_)等。
例如闻镶,查詢年齡大于等于18歲的學生信息:
SELECT * FROM students WHERE age >= 18;
- AND語句
AND語句用于同時滿足多個條件甚脉,語法如下:
SELECT column1, column2, ... FROM table_name WHERE condition1 AND condition2 AND ...;
例如,查詢年齡大于等于18歲且性別為女的學生信息:
SELECT * FROM students WHERE age >= 18 AND gender = '女';
- OR語句
OR語句用于滿足多個條件中的任意一個铆农,語法如下:
SELECT column1, column2, ... FROM table_name WHERE condition1 OR condition2 OR ...;
例如牺氨,查詢年齡大于等于18歲或性別為女的學生信息:
SELECT * FROM students WHERE age >= 18 OR gender = '女';
- IN語句
IN語句用于指定多個值,語法如下:
SELECT column1, column2, ... FROM table_name WHERE column_name IN (value1, value2, ...);
例如顿涣,查詢學號為1001波闹、1002、1003的學生信息:
SELECT * FROM students WHERE id IN (1001, 1002, 1003);
- BETWEEN語句
BETWEEN語句用于指定一個范圍涛碑,語法如下:
SELECT column1, column2, ... FROM table_name WHERE column_name BETWEEN value1 AND value2;
例如精堕,查詢年齡在18歲到20歲之間的學生信息:
SELECT * FROM students WHERE age BETWEEN 18 AND 20;
以上就是條件查詢的基本語法,可以根據(jù)實際需求靈活運用蒲障。
3.在MySQL中歹篓,可以使用ORDER BY子句對查詢結果進行排序
ORDER BY子句可以跟一個或多個列名瘫证,用逗號分隔。默認情況下庄撮,排序是升序的背捌,可以使用DESC關鍵字進行降序排序。
例如洞斯,以下語句將按照age列進行升序排序:
SELECT * FROM students ORDER BY age;
以下語句將按照age列進行降序排序:
SELECT * FROM students ORDER BY age DESC;
可以同時指定多個列進行排序毡庆,例如:
SELECT * FROM students ORDER BY grade DESC, age;
以上語句將先按照grade列進行降序排序,如果有相同的grade值烙如,則按照age列進行升序排序么抗。
注意,ORDER BY子句應該放在查詢語句的最后面亚铁。
4.在MySQL中蝇刀,分組是一種將數(shù)據(jù)按照某個字段進行分類的操作
分組可以用于統(tǒng)計數(shù)據(jù)、計算平均值徘溢、最大值吞琐、最小值等聚合函數(shù)的值。
下面是一個簡單的例子然爆,假設我們有一個學生表站粟,包含學生的姓名、年齡和成績:
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)計每個年齡段的平均成績和最高成績卒蘸,可以使用如下的SQL語句:
SELECT age, AVG(score) AS avg_score, MAX(score) AS max_score
FROM students
GROUP BY age;
執(zhí)行結果如下:
+-----+-----------+----------+
| age | avg_score | max_score |
+-----+-----------+----------+
| 18 | 92.5000 | 95 |
| 19 | 77.5000 | 80 |
| 20 | 85.0000 | 85 |
+-----+-----------+----------+
可以看到,我們按照年齡分組翻默,統(tǒng)計了每個年齡段的平均成績和最高成績。
在分組查詢中恰起,我們還可以使用HAVING子句來過濾分組后的數(shù)據(jù)修械。例如,我們想要找出平均成績大于85分的年齡段检盼,可以使用如下的SQL語句:
SELECT age, AVG(score) AS avg_score
FROM students
GROUP BY age
HAVING avg_score > 85;
執(zhí)行結果如下:
+-----+-----------+
| age | avg_score |
+-----+-----------+
| 18 | 92.5000 |
| 20 | 85.0000 |
+-----+-----------+
可以看到肯污,我們只保留了平均成績大于85分的年齡段。
三丶MySQL高級應用
1.視圖
在MySQL中吨枉,視圖是一種虛擬的表蹦渣,它是由一個或多個基本表的查詢結果組成的。視圖并不存儲數(shù)據(jù)貌亭,而是根據(jù)查詢語句動態(tài)生成結果集柬唯。視圖可以簡化復雜的查詢操作,提高查詢效率圃庭,同時也可以保護數(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)建一個名為employee_view
的視圖拆又,查詢employee
表中的id
、name
和salary
列:
CREATE VIEW employee_view AS
SELECT id, name, salary
FROM employee;
查詢視圖的語法與查詢表的語法類似:
SELECT * FROM view_name;
例如栏账,我們可以查詢employee_view
視圖的結果:
SELECT * FROM employee_view;
視圖也可以進行更新操作帖族,但是需要滿足一定的條件。具體來說发笔,視圖可以進行以下類型的更新操作:
- 對單表視圖進行更新盟萨,即只涉及一個基本表的視圖。
- 對多表視圖進行更新了讨,但是更新操作只能涉及一個基本表的某些列捻激,且這些列必須是唯一的。
更新視圖的語法如下:
UPDATE view_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
例如前计,我們可以更新employee_view
視圖中id為1的員工的薪水:
UPDATE employee_view
SET salary = 5000
WHERE id = 1;
需要注意的是胞谭,更新視圖時,實際上是更新了基本表中的數(shù)據(jù)男杈,而不是視圖本身丈屹。因此,更新視圖時需要滿足基本表的約束條件伶棒,否則會更新失敗旺垒。
除了更新操作,視圖還可以進行插入和刪除操作肤无,具體語法與表的操作類似先蒋。但是需要注意的是,插入和刪除操作只能涉及一個基本表宛渐,且必須滿足基本表的約束條件竞漾。
2.事務
事務是指一組操作,這些操作要么全部執(zhí)行成功窥翩,要么全部不執(zhí)行业岁。在 MySQL 中,事務是通過 ACID 屬性來保證數(shù)據(jù)的一致性和可靠性的寇蚊。
ACID 是指:
- 原子性(Atomicity):事務中的所有操作要么全部執(zhí)行成功笔时,要么全部不執(zhí)行。
- 一致性(Consistency):事務執(zhí)行前后幔荒,數(shù)據(jù)的完整性和約束條件不變糊闽。
- 隔離性(Isolation):事務之間是相互隔離的梳玫,一個事務的執(zhí)行不會影響其他事務的執(zhí)行。
- 持久性(Durability):事務一旦提交右犹,對數(shù)據(jù)的修改就是永久性的提澎,即使系統(tǒng)崩潰也不會丟失。
在 MySQL 中念链,使用 BEGIN盼忌、COMMIT 和 ROLLBACK 語句來控制事務的提交和回滾。
- BEGIN:開始一個事務掂墓。
- COMMIT:提交一個事務谦纱,將事務中的所有操作永久保存到數(shù)據(jù)庫中。
-
ROLLBACK:回滾一個事務君编,將事務中的所有操作撤銷跨嘉。
下面是一個使用事務的示例:
import mysql.connector
# 連接數(shù)據(jù)庫
mydb = mysql.connector.connect(
host="localhost",
user="root",
password="123456",
database="mydatabase"
)
# 獲取游標
mycursor = mydb.cursor()
# 開始事務
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)
# 提交事務
mydb.commit()
except:
# 回滾事務
mydb.rollback()
# 關閉連接
mydb.close()
在上面的示例中,我們使用了 START TRANSACTION 開始一個事務吃嘿,然后執(zhí)行了兩個操作:插入一條數(shù)據(jù)和更新一條數(shù)據(jù)祠乃。如果兩個操作都執(zhí)行成功,就使用 COMMIT 提交事務兑燥,否則就使用 ROLLBACK 回滾事務亮瓷。
3.pyMySQL的使用
pyMySQL是Python中一個用于連接MySQL數(shù)據(jù)庫的第三方庫,它提供了一些簡單易用的API降瞳,可以方便地進行數(shù)據(jù)庫操作嘱支。
- 安裝pyMySQL:
可以使用pip命令進行安裝:
pip install pymysql
- 連接MySQL數(shù)據(jù)庫:
在使用pyMySQL之前,需要先連接到MySQL數(shù)據(jù)庫挣饥。連接MySQL數(shù)據(jù)庫需要指定主機名除师、用戶名、密碼扔枫、數(shù)據(jù)庫名等信息馍盟。可以使用以下代碼進行連接:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", password="password", database="test")
# 使用cursor()方法獲取操作游標
cursor = db.cursor()
# 關閉數(shù)據(jù)庫連接
db.close()
其中茧吊,host表示主機名,user表示用戶名八毯,password表示密碼搓侄,database表示要連接的數(shù)據(jù)庫名。
- 執(zhí)行SQL語句:
連接到MySQL數(shù)據(jù)庫后话速,可以使用cursor對象執(zhí)行SQL語句讶踪。pyMySQL支持執(zhí)行所有的SQL語句,包括查詢泊交、插入乳讥、更新柱查、刪除等操作。以下是一個查詢操作的示例:
import pymysql
# 打開數(shù)據(jù)庫連接
db = pymysql.connect(host="localhost", user="root", password="password", database="test")
# 使用cursor()方法獲取操作游標
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))
# 關閉數(shù)據(jù)庫連接
db.close()
在執(zhí)行SQL語句之前云石,需要先使用cursor()
方法獲取操作游標唉工。執(zhí)行SQL語句可以使用execute()
方法,該方法接受一個SQL語句作為參數(shù)汹忠。查詢操作可以使用fetchall()
方法獲取所有記錄列表淋硝,然后遍歷每一條記錄。
插入宽菜、更新谣膳、刪除操作也可以使用execute()
方法,只需要將對應的SQL語句作為參數(shù)傳入即可铅乡。
以上是pyMySQL的基本使用方法继谚,更多詳細的API可以參考官方文檔。
四丶MySQL ORM框架-SQLAIchemy
SQLAlchemy是一個Python SQL工具包和ORM框架阵幸,它提供了一組廣泛的工具花履,使得在Python中使用SQL更加容易和靈活。SQLAlchemy的主要目標是為SQL數(shù)據(jù)庫提供高效侨嘀、高性能的訪問臭挽,并支持多種關系型數(shù)據(jù)庫,如MySQL咬腕、PostgreSQL欢峰、Oracle、Microsoft SQL Server等涨共。
SQLAlchemy的ORM框架提供了一種將Python對象映射到關系型數(shù)據(jù)庫表的方法纽帖,使得開發(fā)人員可以使用Python語言來操作數(shù)據(jù)庫,而不必直接使用SQL語言举反。ORM框架可以自動創(chuàng)建數(shù)據(jù)庫表懊直、插入數(shù)據(jù)、更新數(shù)據(jù)火鼻、刪除數(shù)據(jù)等操作室囊,同時還支持事務、連接池魁索、緩存等高級功能融撞。
下面是一個使用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實例
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()
# 關閉Session
session.close()
在上面的示例中,我們首先創(chuàng)建了一個數(shù)據(jù)庫連接粗蔚,然后創(chuàng)建了一個Session類和一個Base類尝偎。Session類用于創(chuàng)建Session實例,Base類用于定義ORM映射關系。我們定義了一個User類致扯,它繼承自Base類肤寝,并定義了表名和字段。然后我們使用Base.metadata.create_all()
方法創(chuàng)建了表抖僵。接著我們創(chuàng)建了一個Session實例鲤看,并使用session.add()
方法插入了一條數(shù)據(jù)。使用session.query()
方法查詢數(shù)據(jù)裆针,并使用session.commit()
方法提交事務刨摩。我們還演示了如何更新和刪除數(shù)據(jù),最后使用session.close()
方法關閉Session
世吨。
SQLAlchemy ORM框架提供了豐富的功能和靈活的配置選項澡刹,可以滿足各種不同的需求。同時耘婚,它也有一定的學習曲線罢浇,需要花費一些時間來學習和掌握。
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ù)庫的主機名胞锰,port
是MySQL數(shù)據(jù)庫的端口號,database
是要連接的數(shù)據(jù)庫名兢榨。
接下來嗅榕,定義一個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)
這個ORM模型對應MySQL數(shù)據(jù)庫中的users表,包含id
吵聪、name
和age
三個字段凌那。
接下來,使用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歲的用戶并按照年齡從小到大排序的結果块攒,并打印出來励稳。
除了以上示例,SQLAlchemy還支持更多的查詢方式囱井,如分頁查詢麦锯、聚合查詢等。
以上就是關于python數(shù)據(jù)庫編程MySQL數(shù)據(jù)庫的內容分析
本系列文根據(jù)以下學習路線展開講述琅绅,由于內容較多,:
下章講:Redis數(shù)據(jù)庫