如何使用 Python 的 sqlite3 模块操作 SQLite 数据库?

如何使用 Python 的 sqlite3 模块操作 SQLite 数据库?

SQLite 是一种轻量级的数据库,它不需要服务器,数据库被存储在一个文件中,非常适合嵌入式系统或桌面应用程序。Python 标准库中包含了一个名为 sqlite3 的模块,可以直接用于与 SQLite 数据库进行交互。本文将详细介绍如何使用 Python 的 sqlite3 模块来操作 SQLite 数据库,适合初学者和有数据库基础的人理解。

一、SQLite 简介

1.1 什么是 SQLite?

SQLite 是一种自包含、无服务器、零配置的关系型数据库管理系统(RDBMS)。它的特点是数据存储在一个单一的文件中,不需要像 MySQL、PostgreSQL 等那样配置复杂的数据库服务器,非常适合轻量级应用或快速开发时使用。

主要特点:

  • 轻量级:SQLite 是一个小型的数据库引擎,易于嵌入应用中。
  • 无服务器:它不需要像其他数据库管理系统那样的服务器进程,数据库文件就存储在本地。
  • 易用性:SQLite 操作简单,且无需特别的配置,尤其适合开发和测试阶段。
  • 跨平台:SQLite 可以在各种操作系统上运行,包括 Windows、Linux、macOS 等。

1.2 SQLite 的使用场景

  • 嵌入式应用:SQLite 常用于手机应用或嵌入式设备中,因为它不需要服务器支持,使用灵活。
  • 桌面应用:很多桌面应用也使用 SQLite 来存储配置信息或用户数据。
  • 开发和测试:由于安装配置简单,开发人员常常在开发和测试阶段使用 SQLite 来验证数据库功能。
  • 小型网站:对于一些不需要大量并发和数据操作的应用,SQLite 也是一种很好的选择。

二、Python 的 sqlite3 模块

Python 内置的 sqlite3 模块可以让我们非常方便地操作 SQLite 数据库。接下来我们会介绍如何通过这个模块创建数据库、创建表、插入数据、查询数据等基本操作。

2.1 安装与导入 sqlite3 模块

sqlite3 是 Python 标准库的一部分,所以不需要安装第三方库,直接导入即可。

python 复制代码
import sqlite3

2.2 创建或连接到 SQLite 数据库

在 SQLite 中,数据库是存储在文件中的。如果指定的数据库文件不存在,sqlite3 会自动创建一个新的数据库文件。

python 复制代码
import sqlite3

# 连接到数据库,如果数据库不存在,则会创建一个新文件
conn = sqlite3.connect('example.db')

# 创建游标对象,操作数据库的SQL语句要通过游标来执行
cursor = conn.cursor()

print("数据库连接成功!")

上述代码将连接或创建一个名为 example.db 的数据库文件。如果文件存在,connect 方法将连接到现有的数据库;如果文件不存在,则创建新的数据库文件。

2.3 创建表

创建表的语句与标准 SQL 语法相同。在 SQLite 中,你可以通过 CREATE TABLE 语句来创建新表。

python 复制代码
# 创建一个名为 users 的表
cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER,
        email TEXT
    )
''')

print("表创建成功!")

这里,我们创建了一个 users 表,包含四个字段:

  • id:主键,自动递增(AUTOINCREMENT)。
  • name:用户的名字,非空(NOT NULL)。
  • age:用户的年龄,整数类型。
  • email:用户的电子邮件地址。

2.4 插入数据

插入数据使用 INSERT INTO 语句。可以通过参数化查询来避免 SQL 注入。

python 复制代码
# 插入单条记录
cursor.execute('''
    INSERT INTO users (name, age, email)
    VALUES (?, ?, ?)
''', ("Alice", 25, "alice@example.com"))

# 插入多条记录
users = [
    ("Bob", 30, "bob@example.com"),
    ("Charlie", 22, "charlie@example.com"),
    ("Diana", 28, "diana@example.com")
]

cursor.executemany('''
    INSERT INTO users (name, age, email)
    VALUES (?, ?, ?)
''', users)

# 提交事务
conn.commit()

print("数据插入成功!")

在这里,我们通过 ? 占位符来代替具体的值,防止 SQL 注入攻击。使用 executemany 方法可以批量插入多条数据。

2.5 查询数据

查询数据使用 SELECT 语句,查询结果可以通过游标的 fetchone()fetchall() 方法获取。

python 复制代码
# 查询所有用户
cursor.execute("SELECT * FROM users")

# 获取所有结果
rows = cursor.fetchall()

for row in rows:
    print(row)

查询结果是一个包含每一行数据的列表,每一行数据是一个元组。

2.6 更新数据

更新数据使用 UPDATE 语句。

python 复制代码
# 更新用户的年龄
cursor.execute('''
    UPDATE users SET age = ? WHERE name = ?
''', (26, "Alice"))

# 提交事务
conn.commit()

print("数据更新成功!")

这里将名字为 "Alice" 的用户年龄更新为 26。

2.7 删除数据

删除数据使用 DELETE FROM 语句。

python 复制代码
# 删除名字为 'Bob' 的用户
cursor.execute('''
    DELETE FROM users WHERE name = ?
''', ("Bob",))

# 提交事务
conn.commit()

print("数据删除成功!")

这条语句将删除名字为 "Bob" 的用户记录。

2.8 关闭连接

完成数据库操作后,一定要记得关闭游标和数据库连接。

python 复制代码
# 关闭游标
cursor.close()

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

print("数据库连接已关闭")

三、处理事务

SQLite 默认运行在自动提交模式下,这意味着每一条执行的 SQL 语句(如 INSERTUPDATEDELETE)都会立即生效。如果你希望将多个操作作为一个事务来执行,可以使用 BEGIN TRANSACTIONCOMMIT 语句。

python 复制代码
try:
    # 开始事务
    conn.execute("BEGIN TRANSACTION")

    # 执行一系列数据库操作
    cursor.execute('''
        INSERT INTO users (name, age, email)
        VALUES (?, ?, ?)
    ''', ("Eve", 29, "eve@example.com"))

    cursor.execute('''
        UPDATE users SET age = ? WHERE name = ?
    ''', (30, "Charlie"))

    # 提交事务
    conn.commit()
    print("事务提交成功!")

except sqlite3.Error as e:
    # 出现错误时回滚事务
    conn.rollback()
    print(f"发生错误,事务回滚:{e}")

在这个例子中,我们将多条操作包裹在一个事务中,如果在某个操作中发生错误,我们可以使用 rollback 回滚事务,确保数据库不会被修改。

四、参数化查询和 SQL 注入

SQL 注入是常见的数据库攻击手段之一,通过向 SQL 查询中插入恶意代码,攻击者可以获取或修改数据库中的敏感信息。为了避免这种攻击,应该始终使用参数化查询而不是直接拼接字符串。

错误的做法:

python 复制代码
# 拼接字符串容易导致 SQL 注入
name = "Alice"
age = 25
cursor.execute(f"INSERT INTO users (name, age) VALUES ('{name}', {age})")

正确的做法:

python 复制代码
# 使用参数化查询
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (name, age))

通过使用 ? 占位符和参数化查询,可以避免 SQL 注入的风险。

五、SQLite 的数据类型

SQLite 使用动态类型系统,它的类型系统不像 MySQL、PostgreSQL 那样严格。在 SQLite 中,数据类型大致分为五类:

  • NULL:值是空值。
  • INTEGER:整数类型,正数或负数。
  • REAL:浮点数类型。
  • TEXT:字符串类型。
  • BLOB:二进制大对象,存储二进制数据。

虽然你可以在创建表时指定字段的类型,但是 SQLite 在插入数据时允许你插入与字段类型不匹配的数据。这意味着即使你为某个字段声明了 INTEGER 类型,你仍然可以插入一个文本字符串。

六、SQLite 的限制与适用场景

SQLite 虽然轻量且易于使用,但它并不适用于所有场景。它的性能和并发能力相对有限,因此更适合单用户桌面应用或嵌入式设备。

6.1 适合的场景

  • 单用户桌面应用
  • 嵌入式设备
  • 开发

、测试数据库

  • 小型网站或应用

6.2 不适合的场景

  • 高并发、多用户的 Web 应用
  • 需要复杂事务处理的大型应用
  • 数据量非常大的项目

总结

通过 Python 的 sqlite3 模块,你可以轻松地与 SQLite 数据库进行交互,创建数据库、表,执行插入、查询、更新、删除等操作。SQLite 的轻量级特性使其非常适合嵌入式应用、桌面应用和快速原型开发。

尽管 SQLite 并不适合处理高并发或大规模的数据存储,但对于小型应用或项目,它是一个非常实用的数据库选择。Python 内置的 sqlite3 模块大大简化了 SQLite 数据库操作,非常适合初学者使用。

掌握了这些基础操作后,你可以根据自己的项目需求,灵活地使用 SQLite 或其他数据库进行开发。

相关推荐
momo小菜pa5 分钟前
【MySQL 01】数据库基础
数据库·mysql
zbdx不知名菜鸡14 分钟前
深度学习参数管理
python·深度学习·机器学习
码爸22 分钟前
hbase merge工具
大数据·数据库·hbase
hong_zc24 分钟前
JDBC 编程
java·数据库·mysql
Leoysq24 分钟前
Oracle 数据库常用命令与操作指南
数据库·笔记·oracle
数据与人26 分钟前
Can‘t connect to local MySQL server through socket
数据库
天蓝蓝2352829 分钟前
MySQL数据库的备份与恢复
数据库·mysql·oracle
踏浪逐行30 分钟前
数据库(mysql)常用命令
数据库·mysql
Leoysq1 小时前
Navicate 链接Oracle 提示 Oracle Library is not loaded ,账号密码都正确地址端口也对
数据库·oracle
音程1 小时前
一次使用threading.Thread来实现Pytorch多个模型并发运行的失败案例
人工智能·pytorch·python