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

在Python中使用SQLite數(shù)據(jù)庫(kù)進(jìn)行增刪改查操作的代碼示例

 更新時(shí)間:2025年11月25日 08:43:28   作者:test管家  
SQLite 是 Python 內(nèi)置支持的輕量級(jí)嵌入式數(shù)據(jù)庫(kù),無(wú)需安裝額外服務(wù)端,僅通過(guò)文件(或內(nèi)存)存儲(chǔ)數(shù)據(jù),非常適合小型項(xiàng)目、測(cè)試場(chǎng)景或本地?cái)?shù)據(jù)管理,以下是完整的增刪改查(CRUD)操作教程,包含核心語(yǔ)法、示例代碼和最佳實(shí)踐,需要的朋友可以參考下

一、核心前置知識(shí)

  1. Python 內(nèi)置 sqlite3 模塊,無(wú)需 pip install,直接導(dǎo)入即可使用。
  2. 操作流程:建立連接 → 創(chuàng)建游標(biāo) → 執(zhí)行SQL → 處理結(jié)果 → 提交事務(wù)(增刪改)→ 關(guān)閉資源
  3. 占位符:SQLite 使用 ? 作為參數(shù)占位符(避免 SQL 注入,切勿字符串拼接)。

二、完整 CRUD 示例

步驟1:導(dǎo)入模塊并建立連接

import sqlite3

# 1. 建立連接(關(guān)鍵)
# - 連接本地文件:test.db(不存在則自動(dòng)創(chuàng)建)
# - 內(nèi)存數(shù)據(jù)庫(kù):sqlite3.connect(":memory:")(程序退出后數(shù)據(jù)丟失)
conn = sqlite3.connect("test.db")

# 2. 創(chuàng)建游標(biāo)(執(zhí)行SQL的工具)
cursor = conn.cursor()

步驟2:創(chuàng)建表(基礎(chǔ)準(zhǔn)備)

先定義數(shù)據(jù)表結(jié)構(gòu)(以 users 表為例,包含 id、姓名、年齡、郵箱):

# 創(chuàng)建users表(IF NOT EXISTS 避免重復(fù)創(chuàng)建)
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 自增主鍵
    name TEXT NOT NULL,                    -- 姓名(非空)
    age INTEGER,                           -- 年齡
    email TEXT UNIQUE                      -- 郵箱(唯一,避免重復(fù))
);
"""
cursor.execute(create_table_sql)
conn.commit()  # 建表屬于修改操作,需提交事務(wù)

步驟3:新增數(shù)據(jù)(CREATE)

支持單條插入批量插入,核心是用 ? 占位符傳遞參數(shù):

# 方式1:?jiǎn)螚l插入
insert_single_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?);"
# 參數(shù)以元組形式傳遞,匹配占位符數(shù)量
cursor.execute(insert_single_sql, ("Alice", 25, "alice@example.com"))

# 方式2:批量插入(效率更高,減少IO)
insert_batch_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?);"
data_list = [
    ("Bob", 30, "bob@example.com"),
    ("Charlie", 28, "charlie@example.com"),
    ("David", 22, "david@example.com")
]
cursor.executemany(insert_batch_sql, data_list)

# 增刪改操作必須提交事務(wù),否則數(shù)據(jù)不生效
conn.commit()
print("插入數(shù)據(jù)成功,最后插入的ID:", cursor.lastrowid)  # 獲取最后插入的主鍵ID

步驟4:查詢數(shù)據(jù)(READ)

查詢無(wú)需提交事務(wù),核心是通過(guò) fetchone()/fetchall()/fetchmany(n) 獲取結(jié)果:

# 方式1:查詢單條數(shù)據(jù)(fetchone())
select_single_sql = "SELECT * FROM users WHERE name = ?;"
cursor.execute(select_single_sql, ("Alice",))
single_result = cursor.fetchone()  # 返回元組:(1, 'Alice', 25, 'alice@example.com')
print("單條查詢結(jié)果:", single_result)

# 方式2:查詢多條數(shù)據(jù)(fetchall())
select_all_sql = "SELECT id, name, age FROM users WHERE age > ?;"
cursor.execute(select_all_sql, (25,))
all_results = cursor.fetchall()  # 返回列表嵌套元組:[(2, 'Bob', 30), (3, 'Charlie', 28)]
print("\n多條查詢結(jié)果:")
for row in all_results:
    print(f"ID: {row[0]}, 姓名: {row[1]}, 年齡: {row[2]}")

# 方式3:指定條數(shù)查詢(fetchmany(n))
cursor.execute("SELECT * FROM users;")
many_results = cursor.fetchmany(2)  # 僅獲取前2條
print("\n指定條數(shù)查詢結(jié)果:", many_results)

# 進(jìn)階:返回字典格式結(jié)果(更易讀)
# 創(chuàng)建游標(biāo)時(shí)指定 row_factory
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE id = ?;", (1,))
dict_result = cursor.fetchone()
print("\n字典格式結(jié)果:", dict_result["name"], dict_result["email"])  # 可通過(guò)鍵取值

步驟5:更新數(shù)據(jù)(UPDATE)

根據(jù)條件修改已有數(shù)據(jù),注意加 WHERE 子句(否則會(huì)更新全表):

update_sql = "UPDATE users SET age = ? WHERE name = ?;"
cursor.execute(update_sql, (26, "Alice"))  # 將Alice的年齡改為26
conn.commit()

# 查看受影響的行數(shù)
print("更新影響的行數(shù):", cursor.rowcount)  # 輸出:1

步驟6:刪除數(shù)據(jù)(DELETE)

同樣需加 WHERE 子句(否則刪除全表數(shù)據(jù)):

delete_sql = "DELETE FROM users WHERE id = ?;"
cursor.execute(delete_sql, (4,))  # 刪除ID為4的記錄
conn.commit()

print("刪除影響的行數(shù):", cursor.rowcount)  # 輸出:1

步驟7:關(guān)閉資源(避免泄漏)

# 先關(guān)游標(biāo),再關(guān)連接
cursor.close()
conn.close()

三、最佳實(shí)踐

1. 使用上下文管理器(with 語(yǔ)句)

自動(dòng)關(guān)閉游標(biāo)/連接,無(wú)需手動(dòng) close,更簡(jiǎn)潔安全:

import sqlite3

# 上下文管理器簡(jiǎn)化操作
with sqlite3.connect("test.db") as conn:
    cursor = conn.cursor()
    # 執(zhí)行查詢
    cursor.execute("SELECT * FROM users;")
    print("上下文管理器查詢結(jié)果:", cursor.fetchall())
    # 增刪改無(wú)需手動(dòng)commit,with塊結(jié)束會(huì)自動(dòng)提交(出錯(cuò)則回滾)
    cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?);", ("Eve", 29, "eve@example.com"))

2. 防 SQL 注入(關(guān)鍵)

嚴(yán)禁字符串拼接 SQL,必須使用 ? 占位符:

# 錯(cuò)誤示例(易被注入,如name傳入 "Alice'; DROP TABLE users; --")
name = "Alice"
sql = f"SELECT * FROM users WHERE name = '{name}';"  # 危險(xiǎn)!

# 正確示例(占位符)
sql = "SELECT * FROM users WHERE name = ?;"
cursor.execute(sql, (name,))  # 安全

3. 處理異常(生產(chǎn)環(huán)境必備)

捕獲 sqlite3.Error 異常,避免程序崩潰:

import sqlite3

try:
    conn = sqlite3.connect("test.db")
    cursor = conn.cursor()
    # 執(zhí)行可能出錯(cuò)的操作(如插入重復(fù)郵箱)
    cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?);", ("Frank", 35, "alice@example.com"))
    conn.commit()
except sqlite3.IntegrityError as e:
    # 捕獲唯一鍵沖突異常
    print("插入失?。何ㄒ绘I沖突", e)
    conn.rollback()  # 出錯(cuò)回滾事務(wù)
except sqlite3.Error as e:
    print("數(shù)據(jù)庫(kù)錯(cuò)誤:", e)
    conn.rollback()
finally:
    if cursor:
        cursor.close()
    if conn:
        conn.close()

四、常見(jiàn)問(wèn)題解答

  1. 建表后數(shù)據(jù)不生效?
    增刪改/建表操作需執(zhí)行 conn.commit(),查詢無(wú)需。
  2. 自增主鍵如何獲???
    插入后通過(guò) cursor.lastrowid 獲取最后插入的 ID。
  3. 如何返回字典格式結(jié)果?
    設(shè)置 conn.row_factory = sqlite3.Row,游標(biāo)結(jié)果可通過(guò)鍵取值。
  4. 內(nèi)存數(shù)據(jù)庫(kù)的用途?
    sqlite3.connect(":memory:") 適合臨時(shí)測(cè)試,數(shù)據(jù)僅存于內(nèi)存,程序退出后丟失。

總結(jié)

SQLite 操作的核心是:

  • 連接:sqlite3.connect()(文件/內(nèi)存);
  • 執(zhí)行:cursor.execute()(單條)/executemany()(批量);
  • 參數(shù):用 ? 占位符,避免 SQL 注入;
  • 事務(wù):增刪改需 commit(),異常需 rollback()
  • 資源:用 with 語(yǔ)句或手動(dòng)關(guān)閉游標(biāo)/連接。

掌握以上內(nèi)容,即可滿足 Python 中 SQLite 絕大部分基礎(chǔ)使用場(chǎng)景。

以上就是在Python中使用SQLite數(shù)據(jù)庫(kù)進(jìn)行增刪改查操作的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于Python使用SQLite增刪改查的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • keras建模的3種方式詳解

    keras建模的3種方式詳解

    這篇文章主要介紹了keras建模的3種方式詳解,keras是Google公司于2016年發(fā)布的以tensorflow為后端的用于深度學(xué)習(xí)網(wǎng)絡(luò)訓(xùn)練的高階API,因接口設(shè)計(jì)非常人性化,深受程序員的喜愛(ài),需要的朋友可以參考下
    2023-08-08
  • Python批量解壓&壓縮文件夾的示例代碼

    Python批量解壓&壓縮文件夾的示例代碼

    這篇文章主要介紹了利用Python實(shí)現(xiàn)批量解壓&壓縮文件夾的示例代碼,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的小伙伴快跟隨小編一起動(dòng)手試一試
    2022-04-04
  • K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn)

    K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn)

    這篇文章主要介紹了K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn),幫助大家更好的利用python實(shí)現(xiàn)機(jī)器學(xué)習(xí),感興趣的朋友可以了解下
    2021-01-01
  • 如何利用Python實(shí)現(xiàn)給Excel表格截圖

    如何利用Python實(shí)現(xiàn)給Excel表格截圖

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)給Excel表格截圖功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • python機(jī)器學(xué)習(xí)實(shí)現(xiàn)oneR算法(以鳶尾data為例)

    python機(jī)器學(xué)習(xí)實(shí)現(xiàn)oneR算法(以鳶尾data為例)

    本文主要介紹了python機(jī)器學(xué)習(xí)實(shí)現(xiàn)oneR算法(以鳶尾data為例),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Python獲取對(duì)象信息的常用方法和示例

    Python獲取對(duì)象信息的常用方法和示例

    在Python中,我們經(jīng)常需要獲取和操作對(duì)象的信息,這些信息可能包括對(duì)象的類型、屬性、方法以及內(nèi)存地址等,Python提供了一些內(nèi)置函數(shù)和方法,可以幫助我們獲取這些信息,以下是一些常用的方法和示例,需要的朋友可以參考下
    2025-06-06
  • Pytorch實(shí)現(xiàn)將label變成one hot編碼的兩種方式

    Pytorch實(shí)現(xiàn)將label變成one hot編碼的兩種方式

    這篇文章主要介紹了Pytorch實(shí)現(xiàn)將label變成one hot編碼的兩種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python實(shí)現(xiàn)爬蟲(chóng)抓取與讀寫(xiě)、追加到excel文件操作示例

    Python實(shí)現(xiàn)爬蟲(chóng)抓取與讀寫(xiě)、追加到excel文件操作示例

    這篇文章主要介紹了Python實(shí)現(xiàn)爬蟲(chóng)抓取與讀寫(xiě)、追加到excel文件操作,結(jié)合具體實(shí)例形式分析了Python針對(duì)糗事百科的抓取與Excel文件讀寫(xiě)相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • 用Python實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)(附代碼)

    用Python實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)(附代碼)

    這篇文章主要介紹了用Python實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)(附代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • scrapy-redis的安裝部署步驟講解

    scrapy-redis的安裝部署步驟講解

    今天小編就為大家分享一篇關(guān)于scrapy-redis的安裝部署步驟講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02

最新評(píng)論

罗源县| 西平县| 兴安盟| 景东| 安顺市| 苏尼特右旗| 安义县| 婺源县| 成都市| 门头沟区| 青岛市| 德化县| 商丘市| 伊川县| 阿拉尔市| 东方市| 静安区| 天峻县| 湟中县| 怀远县| 罗平县| 察雅县| 分宜县| 宜阳县| 兰西县| 重庆市| 万盛区| 海宁市| 汕头市| 成安县| 丹江口市| 开封县| 监利县| 玉山县| 沈丘县| 眉山市| 抚宁县| 楚雄市| 惠水县| 海南省| 汾阳市|