SQLite3模块使用详解

目录

一、引言

[1.1 SQLite3 简介](#1.1 SQLite3 简介)

[1.2 Python sqlite3 模块](#1.2 Python sqlite3 模块)

二、连接数据库

[2.1 导入 sqlite3 模块](#2.1 导入 sqlite3 模块)

[2.2 连接数据库](#2.2 连接数据库)

[2.3 创建游标对象](#2.3 创建游标对象)

[三、执行 SQL 语句](#三、执行 SQL 语句)

[3.1 创建表](#3.1 创建表)

[3.2 插入数据](#3.2 插入数据)

[3.3 查询数据](#3.3 查询数据)

[3.4 更新数据](#3.4 更新数据)

[3.5 删除数据](#3.5 删除数据)

四、处理查询结果

[4.1 fetchall()](#4.1 fetchall())

[4.2 fetchone()](#4.2 fetchone())

[4.3 fetchmany(size)](#4.3 fetchmany(size))

五、关闭连接

六、注意事项

[6.1 SQL 注入](#6.1 SQL 注入)

[6.2 事务管理](#6.2 事务管理)

[6.3 错误处理](#6.3 错误处理)

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

[7.1 数据库结构](#7.1 数据库结构)

[7.2 功能实现](#7.2 功能实现)

[7.2.1 初始化数据库](#7.2.1 初始化数据库)

[7.2.2 插入学生信息](#7.2.2 插入学生信息)

[7.2.3 查询学生信息](#7.2.3 查询学生信息)

[7.2.4 更新学生信息](#7.2.4 更新学生信息)

[7.2.5 删除学生信息](#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 会自动创建一个新的数据库文件。

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

2.3 创建游标对象

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

python 复制代码
# 创建游标对象  
cursor = conn.cursor()

三、执行 SQL 语句

3.1 创建表

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

python 复制代码
# 创建表  
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 注入的风险。

python 复制代码
# 插入单条数据  
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) 方法来获取查询结果。

python 复制代码
# 查询所有数据  
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() 方法,并传入更新条件和新的数据值。

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

3.5 删除数据

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

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

四、处理查询结果

4.1 fetchall()

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

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

4.2 fetchone()

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

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

4.3 fetchmany(size)

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

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

五、关闭连接

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

python 复制代码
# 关闭游标  
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 的表,表结构如下:

sql 复制代码
CREATE TABLE IF NOT EXISTS student (  
    id INTEGER PRIMARY KEY AUTOINCREMENT,  
    name TEXT NOT NULL,  
    age INTEGER NOT NULL  
);

7.2 功能实现

7.2.1 初始化数据库
python 复制代码
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 插入学生信息
python 复制代码
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 查询学生信息
python 复制代码
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 更新学生信息
python 复制代码
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 删除学生信息
python 复制代码
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 模块,并在你的项目中灵活运用。如果你有任何问题或建议,欢迎随时与我交流。

相关推荐
꧁薄暮꧂12 分钟前
kafka中的数据清理策略
数据库·分布式·kafka
不爱学习的YY酱41 分钟前
【Linux】<共享内存应用>——模拟实现不同进程把hello字符对<共享内存文件对象>的放入和取出操作
linux·数据库·nosql
网络安全指导员1 小时前
SQL注入的那些面试题总结
数据库·sql·安全·web安全·系统安全
奈斯ing1 小时前
【Oracle篇】SQL性能优化实战案例(从15秒优化到0.08秒)(第七篇,总共七篇)
运维·数据库·sql·oracle·性能优化
Karoku0661 小时前
【企业级分布式系统】ELK-企业级日志分析系统
运维·数据库·redis·mysql·elk·缓存
小小宇宙中微子1 小时前
mysql 命名约束
数据库·sql·oracle
linweidong2 小时前
MariaDB面试题及参考答案
linux·运维·数据库·负载均衡·dba·mariadb·后端面试
PGCCC4 小时前
【PGCCC】Postgresql 缓存替换算法
数据库·缓存·postgresql
盖盖衍上4 小时前
4. SQL视图
数据库·sql