最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中數(shù)據(jù)庫(kù)操作庫(kù)實(shí)戰(zhàn)示例

 更新時(shí)間:2026年02月26日 09:09:38   作者:小小測(cè)試開(kāi)發(fā)  
本文將詳細(xì)介紹Python中最主流、最實(shí)用的數(shù)據(jù)庫(kù)操作庫(kù),涵蓋關(guān)系型數(shù)據(jù)庫(kù)(MySQL、PostgreSQL、SQLite)和非關(guān)系型數(shù)據(jù)庫(kù)(MongoDB、Redis)對(duì)應(yīng)的操作庫(kù),感興趣的朋友跟隨小編一起看看吧

在Python開(kāi)發(fā)中,數(shù)據(jù)庫(kù)操作是高頻需求,無(wú)論是Web開(kāi)發(fā)、數(shù)據(jù)分析、自動(dòng)化測(cè)試,還是后臺(tái)服務(wù),都需要通過(guò)代碼與數(shù)據(jù)庫(kù)交互(增刪改查、連接管理等)。Python生態(tài)中提供了豐富的數(shù)據(jù)庫(kù)操作庫(kù),不同庫(kù)適配不同數(shù)據(jù)庫(kù)類(lèi)型、場(chǎng)景需求,各有優(yōu)劣。

本文將詳細(xì)介紹Python中最主流、最實(shí)用的數(shù)據(jù)庫(kù)操作庫(kù),涵蓋關(guān)系型數(shù)據(jù)庫(kù)(MySQL、PostgreSQL、SQLite)和非關(guān)系型數(shù)據(jù)庫(kù)(MongoDB、Redis)對(duì)應(yīng)的操作庫(kù),每個(gè)庫(kù)均包含「庫(kù)介紹→安裝步驟→核心用法→實(shí)戰(zhàn)示例→注意事項(xiàng)」,兼顧初學(xué)者入門(mén)和開(kāi)發(fā)者實(shí)戰(zhàn)復(fù)用,全程貼合Markdown排版,結(jié)構(gòu)清晰、內(nèi)容詳實(shí)。

注:所有示例均基于Python 3.8+版本,代碼可直接復(fù)制運(yùn)行(需提前安裝對(duì)應(yīng)庫(kù)、配置數(shù)據(jù)庫(kù)環(huán)境);重點(diǎn)講解“通用操作邏輯”,避免冗余,同時(shí)補(bǔ)充生產(chǎn)環(huán)境必備的異常處理、連接池等技巧。

一、前言:Python數(shù)據(jù)庫(kù)操作的核心邏輯

無(wú)論使用哪種數(shù)據(jù)庫(kù)、哪個(gè)操作庫(kù),Python與數(shù)據(jù)庫(kù)交互的核心邏輯一致,可概括為4步,統(tǒng)一梳理如下,后續(xù)所有庫(kù)的示例均遵循此邏輯:

  • 連接數(shù)據(jù)庫(kù):通過(guò)庫(kù)提供的API,傳入數(shù)據(jù)庫(kù)地址、端口、用戶(hù)名、密碼、數(shù)據(jù)庫(kù)名等參數(shù),建立與數(shù)據(jù)庫(kù)的連接(關(guān)鍵:連接需及時(shí)關(guān)閉,避免資源泄露);
  • 創(chuàng)建操作對(duì)象:通過(guò)連接對(duì)象,創(chuàng)建游標(biāo)(cursor)或會(huì)話(huà)(session),用于執(zhí)行SQL語(yǔ)句或數(shù)據(jù)庫(kù)命令;
  • 執(zhí)行操作:通過(guò)操作對(duì)象執(zhí)行增刪改查、建表等操作,獲取執(zhí)行結(jié)果(查詢(xún)操作返回?cái)?shù)據(jù),增刪改返回影響行數(shù));
  • 關(guān)閉資源:操作完成后,先關(guān)閉操作對(duì)象(游標(biāo)/會(huì)話(huà)),再關(guān)閉數(shù)據(jù)庫(kù)連接,順序不可顛倒。

補(bǔ)充:生產(chǎn)環(huán)境中,不建議頻繁創(chuàng)建/關(guān)閉連接(耗時(shí)且耗資源),優(yōu)先使用「連接池」管理連接;同時(shí)需添加異常處理,避免因數(shù)據(jù)庫(kù)異常(如連接失敗、SQL錯(cuò)誤)導(dǎo)致程序崩潰。

二、關(guān)系型數(shù)據(jù)庫(kù)操作庫(kù)(重點(diǎn))

關(guān)系型數(shù)據(jù)庫(kù)(MySQL、PostgreSQL、SQLite)是最常用的數(shù)據(jù)庫(kù)類(lèi)型,特點(diǎn)是數(shù)據(jù)結(jié)構(gòu)化、支持SQL語(yǔ)句、事務(wù)安全。Python中對(duì)應(yīng)操作庫(kù)均遵循“連接→操作→關(guān)閉”的邏輯,以下重點(diǎn)講解3個(gè)主流庫(kù)。

1. MySQLdb / PyMySQL(適配MySQL數(shù)據(jù)庫(kù))

MySQL是Python開(kāi)發(fā)中最常用的關(guān)系型數(shù)據(jù)庫(kù),對(duì)應(yīng)的操作庫(kù)有兩個(gè):MySQLdbPyMySQL,兩者功能一致、用法幾乎相同,核心區(qū)別在于:MySQLdb僅支持Python 2.x,且僅支持Windows系統(tǒng);PyMySQL支持Python 3.x,跨平臺(tái)(Windows、Linux、Mac),是目前的首選。

本文重點(diǎn)講解 PyMySQL(主流、通用),替代過(guò)時(shí)的MySQLdb。

(1)庫(kù)介紹

  • 定位:純Python編寫(xiě)的MySQL客戶(hù)端庫(kù),無(wú)需依賴(lài)C語(yǔ)言擴(kuò)展,安裝簡(jiǎn)單、跨平臺(tái);
  • 核心功能:支持MySQL 5.5+版本,實(shí)現(xiàn)MySQL所有核心操作(增刪改查、事務(wù)、存儲(chǔ)過(guò)程、批量操作等);
  • 優(yōu)勢(shì):輕量、易用、兼容性好,與MySQLdb API完全兼容,可無(wú)縫替換;
  • 劣勢(shì):執(zhí)行效率略低于依賴(lài)C擴(kuò)展的庫(kù)(如mysql-connector-python),但足以滿(mǎn)足絕大多數(shù)場(chǎng)景。

(2)安裝步驟

使用pip命令安裝,直接執(zhí)行以下命令(無(wú)需額外依賴(lài)):

# 安裝PyMySQL(推薦)
pip install pymysql
# 若需安裝MySQLdb(僅Python 2.x,不推薦)
# pip install mysqldb

(3)核心用法與實(shí)戰(zhàn)示例

示例場(chǎng)景:連接本地MySQL數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)名:test_db,用戶(hù)名:root,密碼:123456),實(shí)現(xiàn)「建表→插入數(shù)據(jù)→查詢(xún)數(shù)據(jù)→更新數(shù)據(jù)→刪除數(shù)據(jù)」的完整操作,包含異常處理和連接關(guān)閉。

import pymysql
from pymysql import Error
def mysql_demo():
    # 1. 數(shù)據(jù)庫(kù)連接參數(shù)(根據(jù)實(shí)際環(huán)境修改)
    db_config = {
        "host": "localhost",  # 數(shù)據(jù)庫(kù)地址(本地為localhost)
        "port": 3306,         # 數(shù)據(jù)庫(kù)端口(MySQL默認(rèn)3306)
        "user": "root",       # 用戶(hù)名
        "password": "123456", # 密碼
        "database": "test_db" # 要連接的數(shù)據(jù)庫(kù)名
    }
    # 初始化連接和游標(biāo)
    connection = None
    cursor = None
    try:
        # 2. 建立數(shù)據(jù)庫(kù)連接
        connection = pymysql.connect(**db_config)
        if connection.open:
            print("? 成功連接到MySQL數(shù)據(jù)庫(kù)")
        # 3. 創(chuàng)建游標(biāo)對(duì)象(用于執(zhí)行SQL語(yǔ)句)
        cursor = connection.cursor()
        # 4. 執(zhí)行操作(建表→插入→查詢(xún)→更新→刪除)
        # 4.1 建表(若表不存在)
        create_table_sql = """
        CREATE TABLE IF NOT EXISTS user_info (
            id INT AUTO_INCREMENT PRIMARY KEY,  # 自增主鍵
            name VARCHAR(50) NOT NULL,         # 姓名(非空)
            age INT,                           # 年齡
            gender VARCHAR(10),                # 性別
            create_time DATETIME DEFAULT CURRENT_TIMESTAMP  # 創(chuàng)建時(shí)間(默認(rèn)當(dāng)前時(shí)間)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
        """
        cursor.execute(create_table_sql)
        print("? 表創(chuàng)建成功(若不存在)")
        # 4.2 插入數(shù)據(jù)(單條插入)
        insert_sql = "INSERT INTO user_info (name, age, gender) VALUES (%s, %s, %s)"
        insert_data = ("張三", 25, "男")  # 占位符%s,避免SQL注入(重點(diǎn)?。?
        cursor.execute(insert_sql, insert_data)
        connection.commit()  # 插入/更新/刪除操作需提交事務(wù)
        print(f"? 插入數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
        # 4.3 批量插入數(shù)據(jù)(效率高于單條插入)
        batch_insert_sql = "INSERT INTO user_info (name, age, gender) VALUES (%s, %s, %s)"
        batch_data = [("李四", 28, "男"), ("王五", 23, "女"), ("趙六", 30, "男")]
        cursor.executemany(batch_insert_sql, batch_data)
        connection.commit()
        print(f"? 批量插入數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
        # 4.4 查詢(xún)數(shù)據(jù)(單條查詢(xún)+多條查詢(xún))
        # 單條查詢(xún)(根據(jù)id查詢(xún))
        select_one_sql = "SELECT * FROM user_info WHERE id = %s"
        cursor.execute(select_one_sql, (1,))  # 注意:參數(shù)需是元組,即使只有一個(gè)值
        result_one = cursor.fetchone()  # 獲取單條結(jié)果(返回元組,無(wú)結(jié)果返回None)
        print(f"? 單條查詢(xún)結(jié)果:{result_one}")
        # 多條查詢(xún)(查詢(xún)所有數(shù)據(jù))
        select_all_sql = "SELECT * FROM user_info"
        cursor.execute(select_all_sql)
        result_all = cursor.fetchall()  # 獲取所有結(jié)果(返回列表,每個(gè)元素是元組)
        print(f"? 所有查詢(xún)結(jié)果(共{len(result_all)}條):")
        for row in result_all:
            print(f"id: {row[0]}, 姓名: {row[1]}, 年齡: {row[2]}, 性別: {row[3]}, 創(chuàng)建時(shí)間: {row[4]}")
        # 4.5 更新數(shù)據(jù)
        update_sql = "UPDATE user_info SET age = %s WHERE name = %s"
        update_data = (26, "張三")
        cursor.execute(update_sql, update_data)
        connection.commit()
        print(f"? 更新數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
        # 4.6 刪除數(shù)據(jù)
        delete_sql = "DELETE FROM user_info WHERE name = %s"
        delete_data = ("趙六",)
        cursor.execute(delete_sql, delete_data)
        connection.commit()
        print(f"? 刪除數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
    except Error as e:
        # 異常處理(捕獲連接、SQL執(zhí)行等異常)
        print(f"? 數(shù)據(jù)庫(kù)操作異常:{e}")
        # 若有事務(wù)未提交,回滾(避免數(shù)據(jù)錯(cuò)亂)
        if connection:
            connection.rollback()
    finally:
        # 5. 關(guān)閉資源(先關(guān)游標(biāo),再關(guān)連接,順序不可顛倒)
        if cursor:
            cursor.close()
            print("? 游標(biāo)已關(guān)閉")
        if connection and connection.open:
            connection.close()
            print("? 數(shù)據(jù)庫(kù)連接已關(guān)閉")
# 執(zhí)行示例
if __name__ == "__main__":
    mysql_demo()

(4)關(guān)鍵注意事項(xiàng)

  • 避免SQL注入:必須使用占位符 %s 傳遞參數(shù),不可直接拼接SQL字符串(如 "INSERT INTO user_info VALUES ('" + name + "')"),否則會(huì)導(dǎo)致SQL注入漏洞;
  • 事務(wù)管理:插入、更新、刪除操作必須執(zhí)行 connection.commit() 提交事務(wù),異常時(shí)需執(zhí)行 connection.rollback() 回滾,避免數(shù)據(jù)錯(cuò)亂;
  • 連接關(guān)閉:務(wù)必在finally塊中關(guān)閉游標(biāo)和連接,確保即使出現(xiàn)異常,資源也能正常釋放;
  • 編碼設(shè)置:創(chuàng)建表時(shí)指定 CHARSET=utf8mb4,支持中文和特殊字符(如emoji),避免中文亂碼;
  • 連接池優(yōu)化:生產(chǎn)環(huán)境中,頻繁創(chuàng)建/關(guān)閉連接會(huì)影響效率,可使用 DBUtils 庫(kù)實(shí)現(xiàn)連接池(后續(xù)補(bǔ)充)。

2. sqlite3(適配SQLite數(shù)據(jù)庫(kù),Python內(nèi)置)

SQLite是一款「輕量級(jí)嵌入式關(guān)系型數(shù)據(jù)庫(kù)」,無(wú)需單獨(dú)安裝數(shù)據(jù)庫(kù)服務(wù),數(shù)據(jù)存儲(chǔ)在單個(gè)文件中,適合小型項(xiàng)目、本地測(cè)試、嵌入式開(kāi)發(fā)等場(chǎng)景。Python內(nèi)置 sqlite3 庫(kù),無(wú)需額外安裝,可直接使用。

(1)庫(kù)介紹

  • 定位:Python標(biāo)準(zhǔn)庫(kù)(3.0+版本內(nèi)置),無(wú)需安裝,開(kāi)箱即用;
  • 核心功能:支持SQLite所有核心操作,適配SQLite 3.x版本,支持事務(wù)、觸發(fā)器、視圖等;
  • 優(yōu)勢(shì):輕量、無(wú)需部署、零配置、跨平臺(tái),單個(gè)數(shù)據(jù)庫(kù)文件可直接遷移;
  • 劣勢(shì):不適合高并發(fā)、大數(shù)據(jù)量場(chǎng)景(性能有限),不支持多線程同時(shí)寫(xiě)入。

(2)安裝步驟

無(wú)需安裝!Python 3.0+版本默認(rèn)內(nèi)置,直接導(dǎo)入 sqlite3 即可使用。

(3)核心用法與實(shí)戰(zhàn)示例

示例場(chǎng)景:創(chuàng)建本地SQLite數(shù)據(jù)庫(kù)文件(test_sqlite.db),實(shí)現(xiàn)「建表→插入→查詢(xún)→更新→刪除」完整操作,貼合SQLite輕量特性,補(bǔ)充異常處理。

import sqlite3
from sqlite3 import Error
def sqlite_demo():
    # 1. 數(shù)據(jù)庫(kù)連接參數(shù)(SQLite無(wú)需用戶(hù)名密碼,僅需指定數(shù)據(jù)庫(kù)文件路徑)
    db_path = "test_sqlite.db"  # 數(shù)據(jù)庫(kù)文件存儲(chǔ)路徑(不存在則自動(dòng)創(chuàng)建)
    # 初始化連接和游標(biāo)
    connection = None
    cursor = None
    try:
        # 2. 建立數(shù)據(jù)庫(kù)連接(SQLite連接是文件連接,不存在則創(chuàng)建文件)
        connection = sqlite3.connect(db_path)
        print("? 成功連接到SQLite數(shù)據(jù)庫(kù)(文件:test_sqlite.db)")
        # 3. 創(chuàng)建游標(biāo)對(duì)象
        cursor = connection.cursor()
        # 4. 執(zhí)行操作(建表→插入→查詢(xún)→更新→刪除)
        # 4.1 建表(若表不存在)
        create_table_sql = """
        CREATE TABLE IF NOT EXISTS book_info (
            id INTEGER PRIMARY KEY AUTOINCREMENT,  # SQLite自增用INTEGER,而非INT
            book_name TEXT NOT NULL,               # 書(shū)名(非空)
            author TEXT,                           # 作者
            price REAL,                            # 價(jià)格(浮點(diǎn)型)
            publish_time TEXT                      # 出版時(shí)間(字符串格式)
        );
        """
        cursor.execute(create_table_sql)
        print("? 表創(chuàng)建成功(若不存在)")
        # 4.2 插入數(shù)據(jù)(單條+批量)
        # 單條插入
        insert_sql = "INSERT INTO book_info (book_name, author, price, publish_time) VALUES (?, ?, ?, ?)"
        # SQLite占位符用?,而非%s,注意區(qū)別!
        insert_data = ("Python編程:從入門(mén)到精通", "張三", 89.9, "2023-01-01")
        cursor.execute(insert_sql, insert_data)
        # 批量插入
        batch_data = [
            ("Java編程思想", "李四", 99.9, "2022-05-01"),
            ("SQL必知必會(huì)", "王五", 59.9, "2023-03-15"),
            ("Redis實(shí)戰(zhàn)", "趙六", 79.9, "2023-06-20")
        ]
        cursor.executemany(insert_sql, batch_data)
        connection.commit()  # SQLite同樣需要提交事務(wù)
        print(f"? 插入數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
        # 4.3 查詢(xún)數(shù)據(jù)
        # 單條查詢(xún)(根據(jù)id)
        select_one_sql = "SELECT * FROM book_info WHERE id = ?"
        cursor.execute(select_one_sql, (1,))
        result_one = cursor.fetchone()
        print(f"? 單條查詢(xún)結(jié)果:{result_one}")
        # 多條查詢(xún)(查詢(xún)價(jià)格>60的書(shū)籍)
        select_condition_sql = "SELECT book_name, author, price FROM book_info WHERE price > ?"
        cursor.execute(select_condition_sql, (60,))
        result_condition = cursor.fetchall()
        print(f"? 價(jià)格>60的書(shū)籍(共{len(result_condition)}條):")
        for row in result_condition:
            print(f"書(shū)名: {row[0]}, 作者: {row[1]}, 價(jià)格: {row[2]}元")
        # 4.4 更新數(shù)據(jù)
        update_sql = "UPDATE book_info SET price = ? WHERE book_name = ?"
        update_data = (79.9, "Python編程:從入門(mén)到精通")
        cursor.execute(update_sql, update_data)
        connection.commit()
        print(f"? 更新數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
        # 4.5 刪除數(shù)據(jù)
        delete_sql = "DELETE FROM book_info WHERE author = ?"
        delete_data = ("趙六",)
        cursor.execute(delete_sql, delete_data)
        connection.commit()
        print(f"? 刪除數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
    except Error as e:
        print(f"? 數(shù)據(jù)庫(kù)操作異常:{e}")
        if connection:
            connection.rollback()
    finally:
        # 關(guān)閉資源
        if cursor:
            cursor.close()
            print("? 游標(biāo)已關(guān)閉")
        if connection:
            connection.close()
            print("? 數(shù)據(jù)庫(kù)連接已關(guān)閉")
# 執(zhí)行示例
if __name__ == "__main__":
    sqlite_demo()

(4)關(guān)鍵注意事項(xiàng)

  • 占位符差異:SQLite的占位符是 ?,而非PyMySQL的 %s,這是最容易出錯(cuò)的點(diǎn),務(wù)必注意;
  • 自增字段:SQLite的自增字段需定義為 INTEGER PRIMARY KEY AUTOINCREMENT,而非MySQL的INT AUTO_INCREMENT
  • 數(shù)據(jù)類(lèi)型:SQLite支持的數(shù)據(jù)類(lèi)型較少,常用 TEXT(字符串)、INTEGER(整數(shù))、REAL(浮點(diǎn)),無(wú)需嚴(yán)格匹配類(lèi)型(如字符串可存入整數(shù));
  • 并發(fā)限制:SQLite不支持多線程同時(shí)寫(xiě)入,高并發(fā)場(chǎng)景需避免使用,優(yōu)先選擇MySQL;
  • 文件路徑:若指定的數(shù)據(jù)庫(kù)文件路徑不存在,SQLite會(huì)自動(dòng)創(chuàng)建該文件(無(wú)需手動(dòng)創(chuàng)建),推薦使用絕對(duì)路徑,避免路徑錯(cuò)亂。

3. psycopg2(適配PostgreSQL數(shù)據(jù)庫(kù))

PostgreSQL是一款功能強(qiáng)大、開(kāi)源免費(fèi)的關(guān)系型數(shù)據(jù)庫(kù),支持復(fù)雜查詢(xún)、JSON數(shù)據(jù)類(lèi)型、事務(wù)安全,適合中大型項(xiàng)目、數(shù)據(jù)分析場(chǎng)景。Python中操作PostgreSQL的主流庫(kù)是 psycopg2(依賴(lài)C擴(kuò)展,效率高)和 psycopg2-binary(二進(jìn)制版本,安裝簡(jiǎn)單,無(wú)需編譯)。

(1)庫(kù)介紹

  • 定位:PostgreSQL官方推薦的Python客戶(hù)端庫(kù),功能完整、執(zhí)行效率高;
  • 核心功能:支持PostgreSQL所有特性(復(fù)雜查詢(xún)、JSON、事務(wù)、存儲(chǔ)過(guò)程、批量操作等),適配PostgreSQL 9.0+版本;
  • 優(yōu)勢(shì):效率高、兼容性好,支持異步操作(psycopg2-async),適合中大型項(xiàng)目;
  • 劣勢(shì):安裝時(shí)需依賴(lài)PostgreSQL的開(kāi)發(fā)環(huán)境(編譯版本),推薦使用二進(jìn)制版本 psycopg2-binary 簡(jiǎn)化安裝。

(2)安裝步驟

推薦安裝二進(jìn)制版本(無(wú)需編譯,跨平臺(tái)),執(zhí)行以下命令:

# 安裝psycopg2二進(jìn)制版本(推薦)
pip install psycopg2-binary
# 安裝編譯版本(需提前安裝PostgreSQL開(kāi)發(fā)環(huán)境,不推薦)
# pip install psycopg2

(3)核心用法與實(shí)戰(zhàn)示例

示例場(chǎng)景:連接本地PostgreSQL數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)名:test_pg,用戶(hù)名:postgres,密碼:123456),實(shí)現(xiàn)核心操作,用法與PyMySQL類(lèi)似,重點(diǎn)突出差異點(diǎn)。

import psycopg2
from psycopg2 import Error
def postgresql_demo():
    # 1. 數(shù)據(jù)庫(kù)連接參數(shù)
    db_config = {
        "host": "localhost",
        "port": 5432,          # PostgreSQL默認(rèn)端口5432(區(qū)別于MySQL的3306)
        "user": "postgres",    # PostgreSQL默認(rèn)用戶(hù)名postgres
        "password": "123456",
        "database": "test_pg"
    }
    connection = None
    cursor = None
    try:
        # 2. 建立連接
        connection = psycopg2.connect(**db_config)
        cursor = connection.cursor()
        print("? 成功連接到PostgreSQL數(shù)據(jù)庫(kù)")
        # 3. 建表(支持JSON類(lèi)型,PostgreSQL特色)
        create_table_sql = """
        CREATE TABLE IF NOT EXISTS student_info (
            id SERIAL PRIMARY KEY,  # PostgreSQL自增用SERIAL
            name VARCHAR(50) NOT NULL,
            age INT,
            info JSONB  # 支持JSONB類(lèi)型(高效存儲(chǔ)JSON數(shù)據(jù))
        );
        """
        cursor.execute(create_table_sql)
        print("? 表創(chuàng)建成功(若不存在)")
        # 4. 插入數(shù)據(jù)(支持JSON類(lèi)型數(shù)據(jù))
        insert_sql = "INSERT INTO student_info (name, age, info) VALUES (%s, %s, %s)"
        # PostgreSQL占位符同樣是%s,與PyMySQL一致
        insert_data = ("張三", 20, '{"class": "一班", "score": 90}')  # JSON數(shù)據(jù)傳字符串
        cursor.execute(insert_sql, insert_data)
        # 批量插入
        batch_data = [
            ("李四", 21, '{"class": "二班", "score": 85}'),
            ("王五", 19, '{"class": "一班", "score": 95}')
        ]
        cursor.executemany(insert_sql, batch_data)
        connection.commit()
        print(f"? 插入數(shù)據(jù)成功,影響行數(shù):{cursor.rowcount}")
        # 5. 查詢(xún)數(shù)據(jù)(支持JSON字段查詢(xún),PostgreSQL特色)
        select_sql = "SELECT * FROM student_info WHERE info->>'class' = %s"
        cursor.execute(select_sql, ("一班",))  # 查詢(xún)class為一班的學(xué)生
        result = cursor.fetchall()
        print(f"? 一班學(xué)生(共{len(result)}條):")
        for row in result:
            print(f"id: {row[0]}, 姓名: {row[1]}, 年齡: {row[2]}, 信息: {row[3]}")
        # 6. 更新、刪除操作(與PyMySQL一致)
        update_sql = "UPDATE student_info SET age = %s WHERE name = %s"
        cursor.execute(update_sql, (22, "張三"))
        connection.commit()
        delete_sql = "DELETE FROM student_info WHERE name = %s"
        cursor.execute(delete_sql, ("李四",))
        connection.commit()
    except Error as e:
        print(f"? 數(shù)據(jù)庫(kù)操作異常:{e}")
        if connection:
            connection.rollback()
    finally:
        # 關(guān)閉資源
        if cursor:
            cursor.close()
        if connection:
            connection.close()
            print("? 數(shù)據(jù)庫(kù)連接已關(guān)閉")
if __name__ == "__main__":
    postgresql_demo()

(4)關(guān)鍵注意事項(xiàng)

  • 端口差異:PostgreSQL默認(rèn)端口是 5432,區(qū)別于MySQL的3306,避免端口混淆;
  • 自增字段:PostgreSQL自增字段用 SERIALBIGSERIAL(大整數(shù)),而非MySQL的AUTO_INCREMENT;
  • JSON支持:PostgreSQL原生支持JSON/JSONB類(lèi)型,插入JSON數(shù)據(jù)時(shí)需傳入字符串格式,查詢(xún)時(shí)可通過(guò) ->(獲取JSON對(duì)象)、->>(獲取JSON字符串)操作JSON字段;
  • 默認(rèn)用戶(hù):PostgreSQL默認(rèn)用戶(hù)是 postgres,默認(rèn)無(wú)密碼(需手動(dòng)設(shè)置密碼);
  • 安裝問(wèn)題:若安裝psycopg2失敗,優(yōu)先安裝psycopg2-binary(二進(jìn)制版本),避免編譯依賴(lài)問(wèn)題。

三、非關(guān)系型數(shù)據(jù)庫(kù)操作庫(kù)(重點(diǎn))

非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)無(wú)需固定表結(jié)構(gòu),支持靈活的數(shù)據(jù)存儲(chǔ)(如JSON、鍵值對(duì)),適合大數(shù)據(jù)量、高并發(fā)、數(shù)據(jù)結(jié)構(gòu)不固定的場(chǎng)景。以下講解Python中最常用的兩個(gè)NoSQL數(shù)據(jù)庫(kù)操作庫(kù):MongoDB(文檔型)和Redis(鍵值對(duì)型)。

1. pymongo(適配MongoDB數(shù)據(jù)庫(kù))

MongoDB是一款主流的文檔型NoSQL數(shù)據(jù)庫(kù),數(shù)據(jù)以JSON格式(BSON)存儲(chǔ),無(wú)需固定表結(jié)構(gòu),靈活易用,適合Web開(kāi)發(fā)、日志存儲(chǔ)、數(shù)據(jù)分析等場(chǎng)景。Python中操作MongoDB的主流庫(kù)是 pymongo(MongoDB官方推薦)。

(1)庫(kù)介紹

  • 定位:MongoDB官方Python客戶(hù)端庫(kù),功能完整、易用,支持MongoDB所有核心特性;
  • 核心功能:支持文檔的增刪改查、索引、聚合查詢(xún)、事務(wù)、批量操作等,適配MongoDB 3.6+版本;
  • 優(yōu)勢(shì):API簡(jiǎn)潔、靈活,與MongoDB原生語(yǔ)法高度一致,支持連接池、異步操作(motor庫(kù));
  • 劣勢(shì):復(fù)雜聚合查詢(xún)的語(yǔ)法稍繁瑣,需熟悉MongoDB原生聚合管道。

(2)安裝步驟

# 安裝pymongo
pip install pymongo
# 若需支持異步操作(如FastAPI項(xiàng)目),安裝motor(pymongo的異步版本)
# pip install motor

(3)核心用法與實(shí)戰(zhàn)示例

MongoDB核心概念(與關(guān)系型數(shù)據(jù)庫(kù)對(duì)應(yīng)):數(shù)據(jù)庫(kù)(Database)→ 集合(Collection,對(duì)應(yīng)表)→ 文檔(Document,對(duì)應(yīng)行),無(wú)需提前建庫(kù)、建集合(插入文檔時(shí)自動(dòng)創(chuàng)建)。

示例場(chǎng)景:連接本地MongoDB數(shù)據(jù)庫(kù)(默認(rèn)端口27017,無(wú)用戶(hù)名密碼),實(shí)現(xiàn)「插入文檔→查詢(xún)文檔→更新文檔→刪除文檔」完整操作。

from pymongo import MongoClient
from pymongo.errors import PyMongoError
def mongodb_demo():
    # 1. 數(shù)據(jù)庫(kù)連接參數(shù)
    mongo_url = "mongodb://localhost:27017/"  # MongoDB默認(rèn)地址+端口
    db_name = "test_mongo"  # 數(shù)據(jù)庫(kù)名(不存在則自動(dòng)創(chuàng)建)
    collection_name = "user"  # 集合名(對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫(kù)的表,不存在則自動(dòng)創(chuàng)建)
    client = None
    try:
        # 2. 建立連接(創(chuàng)建MongoClient對(duì)象)
        client = MongoClient(mongo_url)
        print("? 成功連接到MongoDB數(shù)據(jù)庫(kù)")
        # 3. 獲取數(shù)據(jù)庫(kù)對(duì)象
        db = client[db_name]
        # 4. 獲取集合對(duì)象(對(duì)應(yīng)表)
        collection = db[collection_name]
        # 5. 執(zhí)行操作(插入→查詢(xún)→更新→刪除)
        # 5.1 插入文檔(單條+批量)
        # 單條插入(文檔是字典格式,對(duì)應(yīng)JSON)
        single_doc = {
            "name": "張三",
            "age": 25,
            "gender": "男",
            "info": {"city": "北京", "job": "程序員"}
        }
        insert_result = collection.insert_one(single_doc)
        print(f"? 單條插入成功,文檔ID:{insert_result.inserted_id}")
        # 批量插入(傳入列表,每個(gè)元素是字典)
        batch_docs = [
            {"name": "李四", "age": 28, "gender": "男", "info": {"city": "上海", "job": "產(chǎn)品經(jīng)理"}},
            {"name": "王五", "age": 23, "gender": "女", "info": {"city": "廣州", "job": "設(shè)計(jì)師"}},
            {"name": "趙六", "age": 30, "gender": "男", "info": {"city": "深圳", "job": "測(cè)試工程師"}}
        ]
        batch_result = collection.insert_many(batch_docs)
        print(f"? 批量插入成功,文檔IDs:{batch_result.inserted_ids}")
        # 5.2 查詢(xún)文檔(單條+多條+條件查詢(xún))
        # 單條查詢(xún)(根據(jù)條件查詢(xún),find_one返回第一個(gè)匹配文檔)
        single_query = collection.find_one({"name": "張三"})
        print(f"? 單條查詢(xún)結(jié)果:{single_query}")
        # 多條查詢(xún)(查詢(xún)所有g(shù)ender為男的文檔,返回游標(biāo),需遍歷)
        multi_query = collection.find({"gender": "男"})
        print("? 所有男性用戶(hù):")
        for doc in multi_query:
            print(doc)
        # 條件查詢(xún)(查詢(xún)age>25的文檔,只返回name和age字段,隱藏_id)
        condition_query = collection.find(
            {"age": {"$gt": 25}},  # 條件:age>25(MongoDB條件語(yǔ)法)
            {"name": 1, "age": 1, "_id": 0}  # 1:顯示,0:隱藏
        )
        print("? 年齡>25的用戶(hù)(僅顯示姓名和年齡):")
        for doc in condition_query:
            print(doc)
        # 5.3 更新文檔(單條+多條)
        # 單條更新(更新name為張三的文檔,將age改為26)
        update_single = collection.update_one(
            {"name": "張三"},  # 查詢(xún)條件
            {"$set": {"age": 26, "info.city": "杭州"}}  # 更新操作:$set表示修改指定字段
        )
        print(f"? 單條更新成功,匹配行數(shù):{update_single.matched_count},修改行數(shù):{update_single.modified_count}")
        # 多條更新(更新所有g(shù)ender為男的文檔,將age加1)
        update_multi = collection.update_many(
            {"gender": "男"},
            {"$inc": {"age": 1}}  # $inc表示自增
        )
        print(f"? 多條更新成功,匹配行數(shù):{update_multi.matched_count},修改行數(shù):{update_multi.modified_count}")
        # 5.4 刪除文檔(單條+多條)
        # 單條刪除(刪除name為趙六的文檔)
        delete_single = collection.delete_one({"name": "趙六"})
        print(f"? 單條刪除成功,刪除行數(shù):{delete_single.deleted_count}")
        # 多條刪除(刪除age>30的文檔)
        delete_multi = collection.delete_many({"age": {"$gt": 30}})
        print(f"? 多條刪除成功,刪除行數(shù):{delete_multi.deleted_count}")
    except PyMongoError as e:
        print(f"? MongoDB操作異常:{e}")
    finally:
        # 關(guān)閉連接
        if client:
            client.close()
            print("? MongoDB連接已關(guān)閉")
if __name__ == "__main__":
    mongodb_demo()

(4)關(guān)鍵注意事項(xiàng)

  • 連接方式:MongoDB默認(rèn)無(wú)用戶(hù)名密碼,若開(kāi)啟權(quán)限認(rèn)證,連接URL格式為 mongodb://username:password@host:port/;
  • 文檔格式:插入的文檔必須是字典格式(對(duì)應(yīng)BSON),支持嵌套字典(如示例中的info字段);
  • 查詢(xún)條件:MongoDB的查詢(xún)條件使用特殊運(yùn)算符(如 $gt:大于、$lt:小于、$in:包含),需熟悉其語(yǔ)法;
  • 更新操作:必須使用 $set、$inc 等更新運(yùn)算符,否則會(huì)覆蓋整個(gè)文檔(如直接傳入{“age”:26},會(huì)刪除其他所有字段);
  • 游標(biāo)特性:find()方法返回的是游標(biāo),而非直接返回?cái)?shù)據(jù),需遍歷游標(biāo)獲取所有結(jié)果(可使用list()轉(zhuǎn)換為列表,但大數(shù)據(jù)量不推薦);
  • 索引優(yōu)化:大數(shù)據(jù)量查詢(xún)時(shí),需給常用查詢(xún)字段建立索引(如collection.create_index(“name”)),提升查詢(xún)效率。

2. redis-py(適配Redis數(shù)據(jù)庫(kù))

Redis是一款高性能的鍵值對(duì)型NoSQL數(shù)據(jù)庫(kù),數(shù)據(jù)存儲(chǔ)在內(nèi)存中,支持多種數(shù)據(jù)結(jié)構(gòu)(字符串、列表、哈希、集合、有序集合),適合緩存、會(huì)話(huà)存儲(chǔ)、計(jì)數(shù)器、消息隊(duì)列等場(chǎng)景。Python中操作Redis的主流庫(kù)是redis-py(Redis官方推薦)。

(1)庫(kù)介紹

  • 定位:Redis官方Python客戶(hù)端庫(kù),輕量、高效,支持Redis所有核心特性和數(shù)據(jù)結(jié)構(gòu);
  • 核心功能:支持字符串、列表、哈希等所有Redis數(shù)據(jù)結(jié)構(gòu)的操作,支持事務(wù)、管道、發(fā)布訂閱、連接池等;
  • 優(yōu)勢(shì):執(zhí)行效率高(貼合Redis原生性能),API簡(jiǎn)潔,支持連接池,適配Redis 2.6+版本;
  • 劣勢(shì):不支持異步操作(需使用aioredis庫(kù),異步版本),復(fù)雜場(chǎng)景需手動(dòng)封裝。

(2)安裝步驟

# 安裝redis-py(推薦最新版本)
pip install redis
# 若需異步操作(如異步Web項(xiàng)目),安裝aioredis
# pip install aioredis

(3)核心用法與實(shí)戰(zhàn)示例

Redis核心是「鍵值對(duì)」,支持多種數(shù)據(jù)結(jié)構(gòu),每種數(shù)據(jù)結(jié)構(gòu)有對(duì)應(yīng)的操作方法。示例場(chǎng)景:連接本地Redis數(shù)據(jù)庫(kù)(默認(rèn)端口6379,無(wú)用戶(hù)名密碼),演示常用數(shù)據(jù)結(jié)構(gòu)的核心操作。

import redis
from redis.exceptions import RedisError
def redis_demo():
    # 1. 數(shù)據(jù)庫(kù)連接參數(shù)
    redis_config = {
        "host": "localhost",
        "port": 6379,          # Redis默認(rèn)端口6379
        "password": "",        # 若有密碼,傳入密碼字符串
        "db": 0,               # 選擇數(shù)據(jù)庫(kù)(Redis默認(rèn)有16個(gè)數(shù)據(jù)庫(kù),編號(hào)0-15)
        "decode_responses": True  # 關(guān)鍵:設(shè)置為T(mén)rue,返回字符串(默認(rèn)返回bytes類(lèi)型)
    }
    r = None
    try:
        # 2. 建立連接(創(chuàng)建Redis對(duì)象,推薦使用連接池)
        # 方式1:直接創(chuàng)建連接(簡(jiǎn)單場(chǎng)景)
        r = redis.Redis(**redis_config)
        # 方式2:使用連接池(生產(chǎn)環(huán)境推薦,避免頻繁創(chuàng)建/關(guān)閉連接)
        # pool = redis.ConnectionPool(**redis_config)
        # r = redis.Redis(connection_pool=pool)
        # 驗(yàn)證連接(ping()返回True表示連接成功)
        if r.ping():
            print("? 成功連接到Redis數(shù)據(jù)庫(kù)")
        # 3. 執(zhí)行操作(常用數(shù)據(jù)結(jié)構(gòu):字符串、哈希、列表、集合)
        # 3.1 字符串類(lèi)型(String):最基礎(chǔ)的鍵值對(duì),適合緩存、計(jì)數(shù)器
        # 設(shè)置值(key=name, value=張三,過(guò)期時(shí)間60秒)
        r.set("name", "張三", ex=60)
        # 獲取值
        name = r.get("name")
        print(f"? 字符串查詢(xún):name = {name}")
        # 自增(計(jì)數(shù)器)
        r.incr("count")  # count從0變?yōu)?
        r.incr("count", 2)  # count從1變?yōu)?
        count = r.get("count")
        print(f"? 計(jì)數(shù)器:count = {count}")
        # 刪除值
        r.delete("count")
        print(f"? 字符串刪除:count是否存在 = {r.exists('count')}")  # exists返回0表示不存在
        # 3.2 哈希類(lèi)型(Hash):適合存儲(chǔ)對(duì)象(如用戶(hù)信息),鍵值對(duì)嵌套
        # 設(shè)置哈希值(key=user:1,字段name、age、gender)
        r.hset("user:1", mapping={
            "name": "李四",
            "age": 28,
            "gender": "男"
        })
        # 獲取單個(gè)字段值
        user_name = r.hget("user:1", "name")
        print(f"? 哈希查詢(xún)(單個(gè)字段):user:1.name = {user_name}")
        # 獲取所有字段和值
        user_all = r.hgetall("user:1")
        print(f"? 哈希查詢(xún)(所有字段):user:1 = {user_all}")
        # 獲取所有字段名
        user_fields = r.hkeys("user:1")
        print(f"? 哈希查詢(xún)(所有字段名):user:1.fields = {user_fields}")
        # 3.3 列表類(lèi)型(List):有序、可重復(fù),適合消息隊(duì)列、排行榜
        # 向列表左側(cè)添加值
        r.lpush("book_list", "Python編程", "Java編程", "SQL必知必會(huì)")
        # 向列表右側(cè)添加值
        r.rpush("book_list", "Redis實(shí)戰(zhàn)")
        # 獲取列表長(zhǎng)度
        book_len = r.llen("book_list")
        print(f"? 列表長(zhǎng)度:book_list.length = {book_len}")
        # 獲取列表所有值(0表示第一個(gè),-1表示最后一個(gè))
        book_all = r.lrange("book_list", 0, -1)
        print(f"? 列表查詢(xún)(所有值):book_list = {book_all}")
        # 彈出列表左側(cè)值(消息隊(duì)列常用)
        book_pop = r.lpop("book_list")
        print(f"? 列表彈出(左側(cè)):彈出值 = {book_pop},剩余列表 = {r.lrange('book_list', 0, -1)}")
        # 3.4 集合類(lèi)型(Set):無(wú)序、不可重復(fù),適合去重、交集/并集查詢(xún)
        # 向集合添加值
        r.sadd("user_set", "張三", "李四", "王五", "張三")  # 重復(fù)值會(huì)自動(dòng)去重
        # 獲取集合所有值
        user_set_all = r.smembers("user_set")
        print(f"? 集合查詢(xún)(所有值):user_set = {user_set_all}")
        # 判斷值是否在集合中
        is_exist = r.sismember("user_set", "張三")
        print(f"? 集合判斷:張三是否在user_set中 = {is_exist}")
        # 獲取集合長(zhǎng)度
        user_set_len = r.scard("user_set")
        print(f"? 集合長(zhǎng)度:user_set.length = {user_set_len}")
        # 3.5 事務(wù)操作(Redis事務(wù):批量執(zhí)行,要么全部成功,要么全部失敗)
        pipe = r.pipeline()  # 創(chuàng)建管道(事務(wù)載體)
        pipe.set("tx1", "test1")
        pipe.set("tx2", "test2")
        pipe.incr("tx3")
        pipe.execute()  # 執(zhí)行事務(wù)
        print(f"? 事務(wù)執(zhí)行成功:tx1 = {r.get('tx1')}, tx2 = {r.get('tx2')}, tx3 = {r.get('tx3')}")
    except RedisError as e:
        print(f"? Redis操作異常:{e}")
    finally:
        # 關(guān)閉連接(使用連接池時(shí),無(wú)需手動(dòng)關(guān)閉,連接池會(huì)自動(dòng)管理)
        if r:
            r.close()
            print("? Redis連接已關(guān)閉")
if __name__ == "__main__":
    redis_demo()

(4)關(guān)鍵注意事項(xiàng)

  • decode_responses參數(shù):必須設(shè)置為 True,否則所有返回值都是bytes類(lèi)型(需手動(dòng)解碼為字符串),開(kāi)發(fā)中極易出錯(cuò);
  • 連接池優(yōu)化:生產(chǎn)環(huán)境必須使用連接池(ConnectionPool),避免頻繁創(chuàng)建/關(guān)閉連接,提升效率;連接池參數(shù)可根據(jù)并發(fā)量調(diào)整(如max_connections=100);
  • 數(shù)據(jù)結(jié)構(gòu)選型:根據(jù)場(chǎng)景選擇合適的數(shù)據(jù)結(jié)構(gòu)(如緩存用戶(hù)信息用Hash,消息隊(duì)列用List,計(jì)數(shù)器用String,去重用Set);
  • 過(guò)期時(shí)間:緩存場(chǎng)景需給鍵設(shè)置過(guò)期時(shí)間(ex參數(shù),單位秒;px參數(shù),單位毫秒),避免內(nèi)存溢出;
  • 事務(wù)特性:Redis事務(wù)是“弱事務(wù)”,僅保證批量執(zhí)行,不支持回滾(執(zhí)行過(guò)程中出錯(cuò),已執(zhí)行的命令不會(huì)回滾);
  • 密碼與權(quán)限:生產(chǎn)環(huán)境需給Redis設(shè)置密碼,連接時(shí)傳入password參數(shù);同時(shí)限制Redis訪問(wèn)IP,避免安全漏洞;
  • 序列化:若需存儲(chǔ)字典、列表等復(fù)雜數(shù)據(jù),需先序列化(如json.dumps()),讀取時(shí)再反序列化(json.loads()),因?yàn)镽edis僅支持字符串類(lèi)型的鍵值對(duì)。

四、通用進(jìn)階技巧(生產(chǎn)環(huán)境必備)

無(wú)論使用哪種數(shù)據(jù)庫(kù)、哪種操作庫(kù),以下進(jìn)階技巧都是生產(chǎn)環(huán)境必備,可提升腳本穩(wěn)定性、效率和安全性,統(tǒng)一梳理如下:

1. 異常處理全覆蓋

必須捕獲所有可能的異常(如連接失敗、SQL錯(cuò)誤、Redis超時(shí)等),避免程序崩潰;同時(shí)在異常時(shí)做兜底處理(如事務(wù)回滾、日志記錄),便于問(wèn)題排查。

2. 連接池管理

生產(chǎn)環(huán)境中,頻繁創(chuàng)建/關(guān)閉數(shù)據(jù)庫(kù)連接會(huì)嚴(yán)重影響效率,所有庫(kù)都支持連接池(PyMySQL用DBUtils,pymongo用MongoClient內(nèi)置連接池,redis用ConnectionPool),需合理配置連接池參數(shù)(最大連接數(shù)、超時(shí)時(shí)間等)。

3. 避免SQL注入(關(guān)系型數(shù)據(jù)庫(kù))

所有關(guān)系型數(shù)據(jù)庫(kù)(MySQL、PostgreSQL、SQLite)的SQL語(yǔ)句,必須使用占位符傳遞參數(shù),不可直接拼接SQL字符串,避免SQL注入漏洞(重點(diǎn)!)。

4. 日志記錄

在數(shù)據(jù)庫(kù)操作的關(guān)鍵節(jié)點(diǎn)(連接、執(zhí)行SQL、異常)添加日志記錄(使用Python內(nèi)置logging庫(kù)),便于后續(xù)排查問(wèn)題(如定位SQL執(zhí)行失敗的原因、連接超時(shí)的場(chǎng)景)。

5. 數(shù)據(jù)序列化(非關(guān)系型數(shù)據(jù)庫(kù))

MongoDB、Redis存儲(chǔ)復(fù)雜數(shù)據(jù)(字典、列表)時(shí),需先序列化(如json.dumps()),讀取時(shí)反序列化,確保數(shù)據(jù)完整性。

6. 批量操作優(yōu)先

插入、更新、刪除大量數(shù)據(jù)時(shí),優(yōu)先使用批量操作(如executemany、insert_many、hmset),避免單條循環(huán)操作,提升執(zhí)行效率(批量操作可減少網(wǎng)絡(luò)交互次數(shù))。

7. 權(quán)限與安全

生產(chǎn)環(huán)境中,數(shù)據(jù)庫(kù)必須設(shè)置密碼、限制訪問(wèn)IP;敏感數(shù)據(jù)(如密碼、數(shù)據(jù)庫(kù)地址)不可硬編碼在代碼中,需使用配置文件(如config.ini)或環(huán)境變量存儲(chǔ)。

五、總結(jié)

Python中數(shù)據(jù)庫(kù)操作庫(kù)豐富多樣,核心可分為「關(guān)系型數(shù)據(jù)庫(kù)庫(kù)」和「非關(guān)系型數(shù)據(jù)庫(kù)庫(kù)」,選擇時(shí)需遵循「場(chǎng)景適配」原則,總結(jié)如下:

1. 庫(kù)選型建議

  • MySQL數(shù)據(jù)庫(kù):優(yōu)先使用 PyMySQL(Python 3.x,跨平臺(tái));
  • SQLite數(shù)據(jù)庫(kù):直接使用Python內(nèi)置 sqlite3(輕量、無(wú)需部署,適合小型場(chǎng)景);
  • PostgreSQL數(shù)據(jù)庫(kù):優(yōu)先使用 psycopg2-binary(二進(jìn)制版本,安裝簡(jiǎn)單,效率高);
  • MongoDB數(shù)據(jù)庫(kù):優(yōu)先使用 pymongo(官方推薦,功能完整),異步場(chǎng)景用motor;
  • Redis數(shù)據(jù)庫(kù):優(yōu)先使用 redis-py(官方推薦,高效),異步場(chǎng)景用aioredis。

2. 核心要點(diǎn)

  • 所有數(shù)據(jù)庫(kù)操作,均遵循「連接→操作→關(guān)閉」的核心邏輯,重點(diǎn)關(guān)注資源釋放;
  • 生產(chǎn)環(huán)境必備:異常處理、連接池、日志記錄、權(quán)限安全,缺一不可;
  • 避免常見(jiàn)坑點(diǎn):SQL注入(關(guān)系型)、bytes類(lèi)型(Redis)、文檔覆蓋(MongoDB)、連接泄露(所有庫(kù));
  • 實(shí)戰(zhàn)為王:本文所有示例均可直接復(fù)制運(yùn)行,建議結(jié)合實(shí)際數(shù)據(jù)庫(kù)環(huán)境,動(dòng)手實(shí)操一遍,快速掌握核心用法。

Python數(shù)據(jù)庫(kù)操作庫(kù)的核心是「簡(jiǎn)化與數(shù)據(jù)庫(kù)的交互」,無(wú)需深入理解數(shù)據(jù)庫(kù)底層原理,只需掌握對(duì)應(yīng)庫(kù)的API和選型原則,就能高效完成數(shù)據(jù)庫(kù)操作。后續(xù)可根據(jù)具體項(xiàng)目場(chǎng)景,深入學(xué)習(xí)某一個(gè)庫(kù)的高級(jí)特性(如MongoDB聚合查詢(xún)、Redis管道、PostgreSQL JSON操作),進(jìn)一步提升開(kāi)發(fā)效率。

到此這篇關(guān)于Python中數(shù)據(jù)庫(kù)操作庫(kù)詳解的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)庫(kù)操作庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python開(kāi)發(fā)入門(mén)——set的使用

    python開(kāi)發(fā)入門(mén)——set的使用

    這篇文章主要介紹了python set的使用,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-09-09
  • python垃圾回收機(jī)制(GC)原理解析

    python垃圾回收機(jī)制(GC)原理解析

    這篇文章主要介紹了python垃圾回收機(jī)制(GC)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 使用Python代碼實(shí)現(xiàn)PDF文檔與SVG文件之間的轉(zhuǎn)換

    使用Python代碼實(shí)現(xiàn)PDF文檔與SVG文件之間的轉(zhuǎn)換

    PDF作為普遍采用的文件格式,確保了文檔的一致性和可靠性,而SVG(可縮放矢量圖形)則因其矢量性質(zhì),在網(wǎng)頁(yè)設(shè)計(jì)、高分辨率打印及動(dòng)態(tài)交互內(nèi)容中展現(xiàn)出無(wú)與倫比的優(yōu)勢(shì),本文將介紹如何使用Python將PDF文件轉(zhuǎn)換為SVG文件以及將SVG文件轉(zhuǎn)換為PDF文件,需要的朋友可以參考下
    2024-05-05
  • Python中staticmethod和classmethod的作用與區(qū)別

    Python中staticmethod和classmethod的作用與區(qū)別

    今天小編就為大家分享一篇關(guān)于Python中staticmethod和classmethod的作用與區(qū)別,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解

    Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解

    這篇文章主要介紹了Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 7個(gè)實(shí)用的Python自動(dòng)化代碼別再重復(fù)造輪子了

    7個(gè)實(shí)用的Python自動(dòng)化代碼別再重復(fù)造輪子了

    關(guān)于Python有一句名言:不要重復(fù)造輪子,給大家分享經(jīng)過(guò)Python3.6.4調(diào)試通過(guò)的代碼,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • Python函數(shù)中的可變長(zhǎng)參數(shù)詳解

    Python函數(shù)中的可變長(zhǎng)參數(shù)詳解

    在本篇文章里小編給大家整理的是關(guān)于Python函數(shù)中的可變長(zhǎng)參數(shù)的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們參考下。
    2019-09-09
  • 備戰(zhàn)618!用Python腳本幫你實(shí)現(xiàn)淘寶秒殺

    備戰(zhàn)618!用Python腳本幫你實(shí)現(xiàn)淘寶秒殺

    本次的文章,分享一個(gè)淘寶秒殺腳本,這個(gè)腳本用Python編寫(xiě),使用了Python庫(kù)selenium,并且通過(guò)selenium + chromedriver,用程序控制chrome瀏覽器,完成搶購(gòu)的一系列操作.有了這個(gè)腳本,大家至少可以與其他的機(jī)器人站在同一起跑線上,公平搶購(gòu)喜歡的寶貝 ,需要的朋友可以參考下
    2021-06-06
  • tensorflow的計(jì)算圖總結(jié)

    tensorflow的計(jì)算圖總結(jié)

    這篇文章主要介紹了tensorflow的計(jì)算圖總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 使用Python生成條形碼圖片的實(shí)戰(zhàn)代碼

    使用Python生成條形碼圖片的實(shí)戰(zhàn)代碼

    在自動(dòng)化生產(chǎn)、物流配送、商超系統(tǒng)等日常業(yè)務(wù)中,條形碼已成為數(shù)據(jù)快速讀取與追蹤的核心方式,相比手工設(shè)計(jì),使用 Python 編程生成條形碼圖片,能顯著提升效率并支持批量處理,本文將介紹如何使用Python生成條形碼,需要的朋友可以參考下
    2025-05-05

最新評(píng)論

和田市| 尚志市| 拉萨市| 施甸县| 长乐市| 沾益县| 宁明县| 乐陵市| 桃江县| 岳普湖县| 灌南县| 湟中县| 垦利县| 北碚区| 扎囊县| 大荔县| 澜沧| 霍山县| 通山县| 永顺县| 桂林市| 改则县| 新建县| 尼勒克县| 昌宁县| 韶关市| 达日县| 西充县| 松溪县| 射洪县| 荣昌县| 辽中县| 台北市| 始兴县| 简阳市| 新民市| 梁河县| 邢台市| 九龙县| 朔州市| 山东省|