当前位置: 首页 > article >正文

SQLite3模块使用详解

目录

一、引言

1.1 SQLite3 简介

1.2 Python sqlite3 模块

二、连接数据库

2.1 导入 sqlite3 模块

2.2 连接数据库

2.3 创建游标对象

三、执行 SQL 语句

3.1 创建表

3.2 插入数据

3.3 查询数据

3.4 更新数据

3.5 删除数据

四、处理查询结果

4.1 fetchall()

4.2 fetchone()

4.3 fetchmany(size)

五、关闭连接

六、注意事项

6.1 SQL 注入

6.2 事务管理

6.3 错误处理

七、案例:学生信息管理系统

7.1 数据库结构

7.2 功能实现

7.2.1 初始化数据库

7.2.2 插入学生信息

7.2.3 查询学生信息

7.2.4 更新学生信息

7.2.5 删除学生信息

八、总结


SQLite3 是一种轻量级的数据库引擎,它不需要独立的服务器进程,可以直接读写磁盘上的数据库文件。由于其简单易用和高效的特性,SQLite3 成为了许多应用程序和开发者在开发阶段的首选数据库。Python 的 sqlite3 模块提供了对 SQLite3 数据库的直接支持,允许开发者在 Python 环境中轻松地进行数据库操作。本文将详细讲解如何使用 Python 的 sqlite3 模块进行数据库的基本操作,包括连接数据库、执行 SQL 语句、处理查询结果等,并辅以丰富的代码和案例,帮助新手朋友快速入门。

一、引言

1.1 SQLite3 简介

SQLite3 是一种开源的嵌入式数据库管理系统,它实现了自包含的、高可靠的、具有完整事务处理的 SQL 数据库引擎。SQLite3 最大的特点是轻量级,无需配置、无需服务器即可运行,数据库文件直接存储在磁盘上,非常适合用于小型或中型应用程序,以及作为原型开发阶段的数据库。

1.2 Python sqlite3 模块

Python 的 sqlite3 模块提供了对 SQLite3 数据库的接口,使得 Python 开发者可以方便地执行 SQL 语句、管理数据库。该模块是 Python 的标准库之一,因此无需额外安装即可使用。

二、连接数据库

2.1 导入 sqlite3 模块

首先,需要导入 Python 的 sqlite3 模块。
import sqlite3

2.2 连接数据库

使用 sqlite3.connect() 方法可以连接到 SQLite3 数据库。如果指定的数据库文件不存在,SQLite 会自动创建一个新的数据库文件。

# 连接到SQLite数据库  
# 数据库文件是my_database.db,如果文件不存在,会自动在当前目录创建  
conn = sqlite3.connect('my_database.db')

2.3 创建游标对象

游标(Cursor)对象用于执行 SQL 语句并获取结果。通过连接对象的 cursor() 方法可以创建一个游标对象。

# 创建游标对象  
cursor = conn.cursor()

三、执行 SQL 语句

3.1 创建表

使用游标对象的 execute() 方法可以执行 SQL 语句。以下是一个创建表的示例:

# 创建表  
create_table_sql = """  
CREATE TABLE IF NOT EXISTS student (  
    id INTEGER PRIMARY KEY AUTOINCREMENT,  
    name TEXT NOT NULL,  
    age INTEGER NOT NULL  
);  
"""  
cursor.execute(create_table_sql)  
  
# 提交事务  
conn.commit()

3.2 插入数据

插入数据同样使用 execute() 方法,并可以传入参数来避免 SQL 注入的风险。

# 插入单条数据  
insert_sql = "INSERT INTO student (name, age) VALUES (?, ?)"  
cursor.execute(insert_sql, ('Alice', 20))  
  
# 插入多条数据  
insert_many_sql = "INSERT INTO student (name, age) VALUES (?, ?)"  
students = [('Bob', 22), ('Charlie', 23)]  
cursor.executemany(insert_many_sql, students)  
  
# 提交事务  
conn.commit()

3.3 查询数据

查询数据后,可以使用游标对象的 fetchall()、fetchone() 或 fetchmany(size) 方法来获取查询结果。

# 查询所有数据  
query_sql = "SELECT * FROM student"  
cursor.execute(query_sql)  
results = cursor.fetchall()  
  
for row in results:  
    print(row)  
  
# 查询单条数据  
query_one_sql = "SELECT * FROM student WHERE id = 1"  
cursor.execute(query_one_sql)  
result = cursor.fetchone()  
print(result)

3.4 更新数据

更新数据同样使用 execute() 方法,并传入更新条件和新的数据值。

# 更新数据  
update_sql = "UPDATE student SET age = ? WHERE name = ?"  
cursor.execute(update_sql, (21, 'Alice'))  
  
# 提交事务  
conn.commit()

3.5 删除数据

删除数据也使用 execute() 方法,并传入删除条件。

# 删除数据  
delete_sql = "DELETE FROM student WHERE name = ?"  
cursor.execute(delete_sql, ('Bob',))  
  
# 提交事务  
conn.commit()

四、处理查询结果

4.1 fetchall()

fetchall() 方法返回查询结果的所有行,结果是一个元组的列表,每个元组代表一行数据。

# 查询并获取所有结果  
cursor.execute("SELECT * FROM student")  
rows = cursor.fetchall()  
for row in rows:  
    print(row)

4.2 fetchone()

fetchone() 方法返回查询结果的下一行,结果是一个元组,代表一行数据。如果所有行都已返回,则返回 None。

# 查询并获取单行结果  
cursor.execute("SELECT * FROM student WHERE id = 1")  
row = cursor.fetchone()  
print(row)

4.3 fetchmany(size)

fetchmany(size) 方法返回查询结果的下一组行,size 指定返回的行数。如果剩余的行数少于 size,则返回剩余的所有行。

# 查询并获取指定数量的结果  
cursor.execute("SELECT * FROM student")  
rows = cursor.fetchmany(2)  
for row in rows:  
    print(row)

五、关闭连接

操作完成后,应关闭游标和数据库连接,以释放资源。

# 关闭游标  
cursor.close()  
  
# 关闭数据库连接  
conn.close()

六、注意事项

6.1 SQL 注入

使用 SQL 语句时,应避免将用户输入直接拼接到 SQL 语句中,以防止 SQL 注入攻击。可以通过使用参数化查询来避免这一问题。

6.2 事务管理

对于需要多条 SQL 语句协同完成的操作,应使用事务(Transaction)来保证数据的一致性。在 SQLite 中,可以通过 BEGIN TRANSACTION、COMMIT 和 ROLLBACK 语句来管理事务,但 Python 的 sqlite3 模块在调用 commit() 方法时会自动开始一个新的事务。

6.3 错误处理

在执行 SQL 语句时,可能会遇到各种错误,如语法错误、数据类型不匹配等。因此,在编写代码时,应加入适当的错误处理逻辑,以便在遇到错误时能够给出清晰的提示信息。

七、案例:学生信息管理系统

以下是一个简单的学生信息管理系统案例,展示了如何使用 sqlite3 模块进行数据库操作。

7.1 数据库结构

假设有一个名为 student_management.db 的数据库,其中包含一个名为 student 的表,表结构如下:

CREATE TABLE IF NOT EXISTS student (  
    id INTEGER PRIMARY KEY AUTOINCREMENT,  
    name TEXT NOT NULL,  
    age INTEGER NOT NULL  
);

7.2 功能实现

7.2.1 初始化数据库
def init_db(db_path):  
    conn = sqlite3.connect(db_path)  
    cursor = conn.cursor()  
    create_table_sql = """  
    CREATE TABLE IF NOT EXISTS student (  
        id INTEGER PRIMARY KEY AUTOINCREMENT,  
        name TEXT NOT NULL,  
        age INTEGER NOT NULL  
    );  
    """  
    cursor.execute(create_table_sql)  
    conn.commit()  
    cursor.close()  
    conn.close()  
  
# 初始化数据库  
init_db('student_management.db')
7.2.2 插入学生信息
def insert_student(db_path, name, age):  
    conn = sqlite3.connect(db_path)  
    cursor = conn.cursor()  
    insert_sql = "INSERT INTO student (name, age) VALUES (?, ?)"  
    cursor.execute(insert_sql, (name, age))  
    conn.commit()  
    cursor.close()  
    conn.close()  
  
# 插入学生信息  
insert_student('student_management.db', 'David', 21)
7.2.3 查询学生信息
def query_student(db_path, id=None):  
    conn = sqlite3.connect(db_path)  
    cursor = conn.cursor()  
    if id is None:  
        query_sql = "SELECT * FROM student"  
    else:  
        query_sql = "SELECT * FROM student WHERE id = ?"  
    cursor.execute(query_sql, (id,))  
    results = cursor.fetchall()  
    cursor.close()  
    conn.close()  
    return results  
  
# 查询所有学生信息  
print(query_student('student_management.db'))  
  
# 查询指定ID的学生信息  
print(query_student('student_management.db', 1))
7.2.4 更新学生信息
def update_student(db_path, id, name=None, age=None):  
    conn = sqlite3.connect(db_path)  
    cursor = conn.cursor()  
    update_sql = "UPDATE student SET "  
    update_fields = []  
    params = []  
      
    if name is not None:  
        update_fields.append("name = ?")  
        params.append(name)  
    if age is not None:  
        if update_fields:  
            update_fields.append("AND age = ?")  
        else:  
            update_fields.append("age = ?")  
        params.append(age)  
      
    if not update_fields:  
        print("No fields to update.")  
        cursor.close()  
        conn.close()  
        return  
      
    update_sql += ', '.join(update_fields[:-1])  # Remove the last 'AND'  
    update_sql = update_sql.rstrip(' AND') + " WHERE id = ?"  
    params.append(id)  
      
    cursor.execute(update_sql, tuple(params))  
    conn.commit()  
    cursor.close()  
    conn.close()  
  
# 更新学生信息  
update_student('student_management.db', 1, name='David Jr.', age=22)
7.2.5 删除学生信息
def delete_student(db_path, id):  
    conn = sqlite3.connect(db_path)  
    cursor = conn.cursor()  
    delete_sql = "DELETE FROM student WHERE id = ?"  
    cursor.execute(delete_sql, (id,))  
    conn.commit()  
    cursor.close()  
    conn.close()  
  
# 删除学生信息  
delete_student('student_management.db', 2)

八、总结

通过本文,我们详细介绍了如何使用 Python 的 sqlite3 模块进行 SQLite3 数据库的基本操作,包括连接数据库、创建表、插入数据、查询数据、更新数据和删除数据等。同时,我们还通过学生信息管理系统的案例,展示了如何将这些基本操作组合起来,实现一个简单的数据库管理系统。

在实际开发中,SQLite3 由于其轻量级和易于使用的特点,非常适合用于原型开发、小型项目或嵌入式系统。然而,对于需要处理大量数据或高并发访问的应用,可能需要考虑使用更强大的数据库系统,如 MySQL、PostgreSQL 或 MongoDB 等。

希望本文能够帮助你快速入门 SQLite3 和 Python 的 sqlite3 模块,并在你的项目中灵活运用。如果你有任何问题或建议,欢迎随时与我交流。


http://www.kler.cn/news/328079.html

相关文章:

  • 使用WebClient 快速发起请求(不使用WebClientUtils工具类)
  • 测试面试题:pytest断言时,数据是符点类型,如何断言?
  • 【Python|接口自动化测试】使用requests发送http请求时添加headers
  • 【LeetCode】每日一题 2024_9_27 每种字符至少取 K 个(双指针)
  • Android 安装应用-提交阶段之后剩下的操作
  • uniapp生物识别示例(人脸识别、指纹识别)
  • 【docker】docker常见命令
  • 动态分配内存
  • Gin框架简易搭建(3)--Grom与数据库
  • 归并排序【C语言版-笔记】
  • Unreal 实现建造游戏|地面交互shader
  • 06.C/C++内存管理
  • 【数据库】MongoDB 用户权限与数据之间的关系详解
  • Android studio配置AVD虚拟机
  • 【60天备战2024年11月软考高级系统架构设计师——第33天:云计算与大数据架构——大数据处理框架的应用场景】
  • 关于Java中的List<User>如何进行深拷贝
  • 贝锐蒲公英工业物联方案:助力美的智慧楼宇全球布局
  • Leetcode 611. 有效三角形的个数
  • 前端面试题(八)
  • 音视频入门基础:FLV专题(7)——Tag header简介
  • 【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验
  • 【漏洞复现】JeecgBoot 积木报表 queryFieldBySql sql注入漏洞
  • 【进阶OpenCV】 (2)--Harris角点检测
  • 衡水中学资料大全-重构版(状元、学霸笔记)
  • .NET MAUI(.NET Multi-platform App UI)下拉选框控件
  • UE5: Content browser工具编写02
  • 【抽代复习笔记】29-群(二十三):生成子群的两道例题及子群陪集的定义
  • hdlbits系列verilog解答(Exams/m2014 q3)-77
  • 【qt】QQ仿真项目1
  • 【洛谷】P4551 最长异或路径 的题解