在Python中使用SQLite数据库进行增删改查操作的代码示例

作者:

文章目录
  • Python 内置 sqlite3 模块,无需 pip install,直接导入即可使用。 操作流程:建立连接 → 创建游标 → 执行SQL → 处理结果 → 提交事务(增删改)→ 关闭资源。 占位符:SQLite 使用 ? 作为参数占位符(避免 SQL 注入,切勿字符串拼接)。
  • 建表后数据不生效?增删改/建表操作需执行 conn.commit(),查询无需。 自增主键如何获取?插入后通过 cursor.lastrowid 获取最后插入的 ID。 如何返回字典格式结果?设置 conn.row_factory = sqlite3.Row,游标结果可通过键取值。 内存数据库的用途?sqlite3.connect(":memory:") 适合临时测试,数据仅存于内存,程序退出后丢失。
  • SQLite 操作的核心是: 连接:sqlite3.connect()(文件/内存); 执行:cursor.execute()(单条)/executemany()(批量); 参数:用 ? 占位符,避免 SQL 注入; 事务:增删改需 commit(),异常需 rollback(); 资源:用 with 语句或手动关闭游标/连接。 掌握以上内容,即可满足 Python 中 SQLite 绝大部分基础使用场景。 以上就是在Python中使用SQLite数据库进行增删改查操作的代码示例的详细内容,更多关于Python使用SQLite增删改查的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: 利用Python实现sqlite3增删改查的封装 Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】 Python进行SQLite和MySQL数据库连接与操作的完整指南 Python使用FastAPI+SQLite构建一个短链接生成器服务 如何用Python检查SQLite数据库中表是否存在
  • 目录
    • 一、核心前置知识
    • 二、完整 CRUD 示例
      • 步骤1:导入模块并建立连接
      • 步骤2:创建表(基础准备)
      • 步骤3:新增数据(CREATE)
      • 步骤4:查询数据(READ)
      • 步骤5:更新数据(UPDATE)
      • 步骤6:删除数据(DELETE)
      • 步骤7:关闭资源(避免泄漏)
    • 三、最佳实践
      • 1. 使用上下文管理器(with 语句)
      • 2. 防 SQL 注入(关键)
      • 3. 处理异常(生产环境必备)
    • 四、常见问题解答
      • 总结

        1. Python 内置 sqlite3 模块,无需 pip install,直接导入即可使用。
        2. 操作流程:建立连接 → 创建游标 → 执行SQL → 处理结果 → 提交事务(增删改)→ 关闭资源
        3. 占位符:SQLite 使用 ? 作为参数占位符(避免 SQL 注入,切勿字符串拼接)。

        import sqlite3
        
        # 1. 建立连接(关键)
        # - 连接本地文件:test.db(不存在则自动创建)
        # - 内存数据库:sqlite3.connect(":memory:")(程序退出后数据丢失)
        conn = sqlite3.connect("test.db")
        
        # 2. 创建游标(执行SQL的工具)
        cursor = conn.cursor()
        

        先定义数据表结构(以 users 表为例,包含 id、姓名、年龄、邮箱):

        # 创建users表(IF NOT EXISTS 避免重复创建)
        create_table_sql = """
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 自增主键
            name TEXT NOT NULL,                    -- 姓名(非空)
            age INTEGER,                           -- 年龄
            email TEXT UNIQUE                      -- 邮箱(唯一,避免重复)
        );
        """
        cursor.execute(create_table_sql)
        conn.commit()  # 建表属于修改操作,需提交事务
        

        支持单条插入批量插入,核心是用 ? 占位符传递参数:

        # 方式1:单条插入
        insert_single_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?);"
        # 参数以元组形式传递,匹配占位符数量
        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)
        
        # 增删改操作必须提交事务,否则数据不生效
        conn.commit()
        print("插入数据成功,最后插入的ID:", cursor.lastrowid)  # 获取最后插入的主键ID
        

        查询无需提交事务,核心是通过 fetchone()/fetchall()/fetchmany(n) 获取结果:

        # 方式1:查询单条数据(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("单条查询结果:", single_result)
        
        # 方式2:查询多条数据(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多条查询结果:")
        for row in all_results:
            print(f"ID: {row[0]}, 姓名: {row[1]}, 年龄: {row[2]}")
        
        # 方式3:指定条数查询(fetchmany(n))
        cursor.execute("SELECT * FROM users;")
        many_results = cursor.fetchmany(2)  # 仅获取前2条
        print("n指定条数查询结果:", many_results)
        
        # 进阶:返回字典格式结果(更易读)
        # 创建游标时指定 row_factory
        conn.row_factory = sqlite3.Row
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM users WHERE id = ?;", (1,))
        dict_result = cursor.fetchone()
        print("n字典格式结果:", dict_result["name"], dict_result["email"])  # 可通过键取值
        

        根据条件修改已有数据,注意加 WHERE 子句(否则会更新全表):

        update_sql = "UPDATE users SET age = ? WHERE name = ?;"
        cursor.execute(update_sql, (26, "Alice"))  # 将Alice的年龄改为26
        conn.commit()
        
        # 查看受影响的行数
        print("更新影响的行数:", cursor.rowcount)  # 输出:1
        

        同样需加 WHERE 子句(否则删除全表数据):

        delete_sql = "DELETE FROM users WHERE id = ?;"
        cursor.execute(delete_sql, (4,))  # 删除ID为4的记录
        conn.commit()
        
        print("删除影响的行数:", cursor.rowcount)  # 输出:1
        

        # 先关游标,再关连接
        cursor.close()
        conn.close()
        

        自动关闭游标/连接,无需手动 close,更简洁安全:

        import sqlite3
        
        # 上下文管理器简化操作
        with sqlite3.connect("test.db") as conn:
            cursor = conn.cursor()
            # 执行查询
            cursor.execute("SELECT * FROM users;")
            print("上下文管理器查询结果:", cursor.fetchall())
            # 增删改无需手动commit,with块结束会自动提交(出错则回滚)
            cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?);", ("Eve", 29, "eve@example.com"))
        

        严禁字符串拼接 SQL,必须使用 ? 占位符:

        # 错误示例(易被注入,如name传入 "Alice'; DROP TABLE users; --")
        name = "Alice"
        sql = f"SELECT * FROM users WHERE name = '{name}';"  # 危险!
        
        # 正确示例(占位符)
        sql = "SELECT * FROM users WHERE name = ?;"
        cursor.execute(sql, (name,))  # 安全
        

        捕获 sqlite3.Error 异常,避免程序崩溃:

        import sqlite3
        
        try:
            conn = sqlite3.connect("test.db")
            cursor = conn.cursor()
            # 执行可能出错的操作(如插入重复邮箱)
            cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?);", ("Frank", 35, "alice@example.com"))
            conn.commit()
        except sqlite3.IntegrityError as e:
            # 捕获唯一键冲突异常
            print("插入失败:唯一键冲突", e)
            conn.rollback()  # 出错回滚事务
        except sqlite3.Error as e:
            print("数据库错误:", e)
            conn.rollback()
        finally:
            if cursor:
                cursor.close()
            if conn:
                conn.close()
        

        1. 建表后数据不生效?
          增删改/建表操作需执行 conn.commit(),查询无需。
        2. 自增主键如何获取?
          插入后通过 cursor.lastrowid 获取最后插入的 ID。
        3. 如何返回字典格式结果?
          设置 conn.row_factory = sqlite3.Row,游标结果可通过键取值。
        4. 内存数据库的用途?
          sqlite3.connect(":memory:") 适合临时测试,数据仅存于内存,程序退出后丢失。

        SQLite 操作的核心是:

        • 连接:sqlite3.connect()(文件/内存);
        • 执行:cursor.execute()(单条)/executemany()(批量);
        • 参数:用 ? 占位符,避免 SQL 注入;
        • 事务:增删改需 commit(),异常需 rollback()
        • 资源:用 with 语句或手动关闭游标/连接。

        掌握以上内容,即可满足 Python 中 SQLite 绝大部分基础使用场景。

        以上就是在Python中使用SQLite数据库进行增删改查操作的代码示例的详细内容,更多关于Python使用SQLite增删改查的资料请关注风君子博客其它相关文章!

        您可能感兴趣的文章:

        • 利用Python实现sqlite3增删改查的封装
        • Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
        • Python进行SQLite和MySQL数据库连接与操作的完整指南
        • Python使用FastAPI+SQLite构建一个短链接生成器服务
        • 如何用Python检查SQLite数据库中表是否存在

        站内搜索