首页 > 数据库 >SQLite3模块使用详解

SQLite3模块使用详解

时间:2024-09-27 15:20:59浏览次数:9  
标签:模块 数据库 db cursor 详解 student sql SQLite3 conn

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

SQLite3模块使用详解_sqlite

一、引言

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 zhuru的风险。

# 插入单条数据  
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 语句协同完成的操作,应使用事务(Transaction)来保证数据的一致性。在 SQLite 中,可以通过 BEGIN TRANSACTION、COMMIT 和 ROLLBACK 语句来管理事务,但 Python 的 sqlite3 模块在调用 commit() 方法时会自动开始一个新的事务。

6.2 错误处理

在执行 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 模块,并在你的项目中灵活运用。如果你有任何问题或建议,欢迎随时与我交流。


标签:模块,数据库,db,cursor,详解,student,sql,SQLite3,conn
From: https://blog.51cto.com/u_16304808/12129607

相关文章

  • LMZ23605具备 36V 最高输入电压的 5A SIMPLE SWITCHER®易电源电源模块
    LMZ23605SIMPLESWITCHER®易电源电源模块是一种易于使用的降压直流/直流解决方案,具有驱动高达5A的负载的能力。LMZ223605采用创新封装模式,提高了散热性能,可以手工或机器焊接。LMZ23605可以工作于6V和36V之间的输入电压轨,并提供低至0.8V的可调高精度输出电压。LMZ23605只......
  • Docker Init 实战详解:从入门到精通
    1.引言在容器化应用开发的世界里,Docker一直是首选工具。然而,对于初学者来说,创建Dockerfile和设置Docker环境可能是一个挑战。为了简化这个过程,Docker引入了dockerinit命令。本文将深入探讨DockerInit的方方面面,从其诞生背景到高级应用,为您提供全面的指南。©......
  • 一文详解WebRTC、RTSP、RTMP、SRT
     背景好多开发者,希望对WebRTC、RTSP、RTMP、SRT有个初步的了解,知道什么场景该做怎样的方案选择,本文就四者区别做个大概的介绍。WebRTC提到WebRTC,相信好多开发者第一件事想到的就是低延迟,WebRTC(WebReal-TimeCommunication)是一项实时通讯技术,它允许网络应用或者站点在不借助中间媒......
  • 自动化办公-Python-os模块的使用
    os.path模块的使用在指定文件路径时,由于操作系统的差异,直接使用硬编码的路径可能会导致程序在不同平台上无法正常运行。为了解决这个问题,Python提供了os.path模块,它包含了一系列用于路径操作的函数,可以帮助您以跨平台的方式处理文件路径。为什么要使用os.path模块......
  • Spark学习(二):RDD详解
    Spark学习(二):RDD详解RDDAPI一般来说有三种创建RDD的方式由外部存储系统的数据集创建(比如本地的文件系统,同时兼容所有Hadoop支持的数据集):sc.textFile通过已有的RDD通过算子转换生成新的RDD:rdd1.flatMap(_.split(""))通过一个Scala集合创建:sc.parallelize()RDD原理MapRedu......
  • (图文并茂,权威最详细)Wireshark抓包分析 TCP三次握手/四次挥手详解
    本文结合wireshark抓包,对TCP协议的三次握手和四次挥手进行详细的讲解。大家要认真看完,这可能是全网讲得最详细的文章了。01TCP/IP协议族TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能。包含以下四个层次:1.链路层,也称作数据链路层或者网络接口层,......
  • pbootcms:未检测到您服务器环境的sqlite3数据库扩展
    当遇到PBootCMS提示“未检测到您服务器环境的sqlite3数据库扩展”的错误时,可以通过以下两种方法来解决:第一种方法:把数据库配置连接驱动改为 pdo_sqlite打开数据库配置文件找到 database.php 文件,通常位于 \APPs\config\ 目录下。修改数据库配置将 type 的......
  • 强化学习详解:理论基础与核心算法解析
    本文详细介绍了强化学习的基础知识和基本算法,包括动态规划、蒙特卡洛方法和时序差分学习,解析了其核心概念、算法步骤及实现细节。关注作者,复旦AI博士,分享AI领域全维度知识与研究。拥有10+年AI领域研究经验、复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心......
  • maven parent: 指定了项目的父 POM packaging: 指定打包类型为 POM。 modules: 列出了
    1.parent定义:这是指一个项目的父POM(ProjectObjectModel)。在Maven中,父POM可以包含共享的配置、依赖和插件设置,使多个子项目可以继承这些设置。作用:通过指定父POM,子项目可以自动获取父项目中定义的依赖版本、插件配置等,减少重复配置,提高一致性。例如,所有子模块......
  • 【EBS】Oracle EBS 之 OM 模块整理(1)
      近期在学习OracleEBS系统中的OM订单销售模块的相关内容,这里先做一个基本的流程整理记录,从销售订单的录入登记,最终到订单货物的发运确认等。一、基本流程  一个基本的订单流程,基本上都是从接到客户的需求订单开始的,在将该订单录入登记到系统中之后,便可以通过EBS中的完......