跟我一起從零開始學python(四)數(shù)據(jù)庫編程:MySQL數(shù)據(jù)庫

前言

回顧之前講了python語法編程 谍婉,必修入門基礎和網(wǎng)絡編程彪腔,多線程/多進程/協(xié)程等方面的內容攒钳,今天到了數(shù)據(jù)庫編程篇,前面沒看的也不用往前翻香浩,系列文已經(jīng)整理好了:

1.跟我一起從零開始學python(一)編程語法必修
2.跟我一起從零開始學python(二)網(wǎng)絡編程
3.跟我一起從零開始學python(三)多線程/多進程/協(xié)程

本篇講:python數(shù)據(jù)庫編程:MySQL數(shù)據(jù)庫

本系列文根據(jù)以下學習路線展開講述类缤,由于內容較多,:

從零開始學python到高級進階路線圖

一丶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\_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是要刪除數(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ù)表处窥,包含兩個字段nameaddress嘱吗,類型均為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表中的idnamesalary列:

    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')

其中,usernamepassword是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吵聪、nameage三個字段凌那。

接下來,使用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ù)以下學習路線展開講述琅绅,由于內容較多,:

從零開始學python到高級進階路線圖

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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末鹅巍,一起剝皮案震驚了整個濱河市千扶,隨后出現(xiàn)的幾起案子料祠,更是在濱河造成了極大的恐慌,老刑警劉巖澎羞,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件髓绽,死亡現(xiàn)場離奇詭異,居然都是意外死亡妆绞,警方通過查閱死者的電腦和手機顺呕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來括饶,“玉大人株茶,你說我怎么就攤上這事⊥佳妫” “怎么了启盛?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長技羔。 經(jīng)常有香客問我僵闯,道長,這世上最難降的妖魔是什么藤滥? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任鳖粟,我火速辦了婚禮,結果婚禮上拙绊,老公的妹妹穿的比我還像新娘向图。我一直安慰自己,他們只是感情好时呀,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布张漂。 她就那樣靜靜地躺著,像睡著了一般谨娜。 火紅的嫁衣襯著肌膚如雪航攒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天趴梢,我揣著相機與錄音漠畜,去河邊找鬼。 笑死坞靶,一個胖子當著我的面吹牛憔狞,可吹牛的內容都是我干的。 我是一名探鬼主播彰阴,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼瘾敢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起簇抵,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤庆杜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碟摆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晃财,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年典蜕,在試婚紗的時候發(fā)現(xiàn)自己被綠了断盛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡愉舔,死狀恐怖钢猛,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情屑宠,我是刑警寧澤厢洞,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站典奉,受9級特大地震影響躺翻,放射性物質發(fā)生泄漏。R本人自食惡果不足惜卫玖,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一公你、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧假瞬,春花似錦陕靠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至琴许,卻和暖如春税肪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榜田。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工益兄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箭券。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓净捅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辩块。 傳聞我的和親對象是個殘疾皇子蛔六,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容