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

前言

回顧之前講了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è)字段nameaddress,類型均為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、namesalary列:

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

其中,usernamepassword是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、nameage三個(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ù)庫

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容