python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python sqlite3操作SQLite数据库

Python+sqlite3操作本地SQLite数据库的实战指南

作者:yuanpan

本文介绍了Python标准库sqlite3的使用方法,通过用户信息管理示例演示了SQLite数据库的基本操作,包括创建数据库、创建数据表、插入数据、查询数据、修改数据、删除数据等,并简单介绍了Python ORM思想,需要的朋友可以参考下

对于 Python 后端初学者来说,数据库操作是必须掌握的基础能力。很多 Web 项目、接口服务、爬虫程序、桌面工具都会涉及数据的保存、查询和更新。

如果你刚开始学习数据库,不一定要马上安装 MySQL、PostgreSQL 这类独立数据库服务。Python 标准库自带的 sqlite3 就可以直接操作 SQLite 本地数据库,非常适合学习 SQL、练习 CRUD、开发小型本地项目。

本文将通过一个“用户信息管理”的例子,带你完成:

一、sqlite3 库介绍

sqlite3 是 Python 标准库自带的 SQLite 数据库操作模块,不需要额外安装。

SQLite 是一种轻量级嵌入式数据库,它的特点是:

在 Python 中使用 SQLite,只需要导入:

import sqlite3

一个典型的数据库操作流程如下:

import sqlite3

conn = sqlite3.connect("demo.db")
cursor = conn.cursor()

cursor.execute("SELECT sqlite_version()")
print(cursor.fetchone())

conn.close()

这里有几个重要概念:

二、创建数据库

使用 SQLite 创建数据库非常简单,只需要连接一个 .db 文件即可。

import sqlite3

conn = sqlite3.connect("student.db")
conn.close()

运行后,当前目录下会生成一个 student.db 文件。

如果文件已经存在,sqlite3.connect() 会直接连接这个数据库;如果文件不存在,就会自动创建。

在实际项目中,也可以把数据库文件放到指定目录:

conn = sqlite3.connect(r"D:\data\student.db")

Windows 路径前面加 r,可以避免反斜杠被当作转义字符。

三、创建数据表

数据库文件创建好以后,还需要创建数据表。数据表类似 Excel 中的一张工作表,用来存储某一类数据。

下面创建一张 users 表,用来保存用户信息:

import sqlite3

conn = sqlite3.connect("app.db")
cursor = conn.cursor()

sql = """
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER,
    email TEXT UNIQUE,
    created_at TEXT DEFAULT CURRENT_TIMESTAMP
)
"""

cursor.execute(sql)
conn.commit()
conn.close()

字段说明:

CREATE TABLE IF NOT EXISTS 的意思是:如果表不存在就创建,如果已经存在就不重复创建,避免程序重复运行时报错。

四、插入数据

插入数据使用 INSERT INTO 语句。

import sqlite3

conn = sqlite3.connect("app.db")
cursor = conn.cursor()

sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)"
cursor.execute(sql, ("张三", 22, "zhangsan@example.com"))

conn.commit()
conn.close()

这里需要重点注意:推荐使用 ? 占位符传参,而不是直接拼接字符串。

推荐写法:

cursor.execute(
    "INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
    ("李四", 25, "lisi@example.com")
)

不推荐写法:

name = "李四"
sql = "INSERT INTO users (name) VALUES ('" + name + "')"

字符串拼接 SQL 容易出现 SQL 注入风险,也容易因为引号、特殊字符导致 SQL 报错。

如果要一次插入多条数据,可以使用 executemany()

users = [
    ("王五", 28, "wangwu@example.com"),
    ("赵六", 30, "zhaoliu@example.com"),
    ("钱七", 24, "qianqi@example.com")
]

cursor.executemany(
    "INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
    users
)
conn.commit()

五、查询数据

查询数据使用 SELECT 语句。

查询所有用户:

cursor.execute("SELECT id, name, age, email, created_at FROM users")
rows = cursor.fetchall()

for row in rows:
    print(row)

fetchall() 会获取所有查询结果,返回一个列表,每一行是一个元组。

如果只想查询一条数据,可以使用 fetchone()

cursor.execute("SELECT id, name, age, email FROM users WHERE id = ?", (1,))
user = cursor.fetchone()
print(user)

注意 (1,) 不是写错了。Python 中只有一个元素的元组,必须加逗号。

也可以按条件查询:

cursor.execute(
    "SELECT id, name, age, email FROM users WHERE age >= ?",
    (25,)
)
rows = cursor.fetchall()

六、修改数据

修改数据使用 UPDATE 语句。

下面把 id=1 的用户年龄改为 23

cursor.execute(
    "UPDATE users SET age = ? WHERE id = ?",
    (23, 1)
)
conn.commit()

如果想同时修改多个字段,可以这样写:

cursor.execute(
    "UPDATE users SET name = ?, email = ? WHERE id = ?",
    ("张三丰", "zhangsanfeng@example.com", 1)
)
conn.commit()

执行 UPDATE 时一定要小心 WHERE 条件。如果没有 WHERE,可能会把整张表的数据都修改掉。

七、删除数据

删除数据使用 DELETE 语句。

删除 id=1 的用户:

cursor.execute("DELETE FROM users WHERE id = ?", (1,))
conn.commit()

同样要注意:DELETE 语句必须谨慎使用 WHERE 条件。

危险写法:

cursor.execute("DELETE FROM users")

这会删除 users 表中的所有数据。

如果只是想清空测试数据,可以明确知道后果后再执行。

八、事务和异常处理

在数据库操作中,新增、修改、删除都需要提交事务。

如果执行成功,就调用:

conn.commit()

如果执行失败,可以回滚:

conn.rollback()

更推荐使用 try...except...finally 管理数据库连接:

import sqlite3

conn = None

try:
    conn = sqlite3.connect("app.db")
    cursor = conn.cursor()
    cursor.execute(
        "INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
        ("测试用户", 20, "test@example.com")
    )
    conn.commit()
except sqlite3.Error as e:
    if conn:
        conn.rollback()
    print("数据库操作失败:", e)
finally:
    if conn:
        conn.close()

这样可以避免程序异常时数据库连接没有关闭。

九、Python ORM 思想简单介绍

前面我们直接写 SQL 操作数据库,这种方式直观、灵活,也适合初学者理解数据库底层逻辑。

在真实后端项目中,还经常会使用 ORM。

ORM 的全称是 Object Relational Mapping,中文通常叫“对象关系映射”。它的核心思想是:

把数据库中的表映射成 Python 类,把表中的一行数据映射成 Python 对象,把字段映射成对象属性。

例如数据库中有一张 users 表:

users 表
id | name | age | email

在 ORM 中,可能会定义一个 User 类:

class User:
    def __init__(self, id, name, age, email):
        self.id = id
        self.name = name
        self.age = age
        self.email = email

查询数据库后,可以把一行数据转换成对象:

row = (1, "张三", 22, "zhangsan@example.com")
user = User(row[0], row[1], row[2], row[3])

print(user.name)

这样做的好处是:

Python 中常见 ORM 框架包括:

不过,建议初学者先掌握基础 SQL 和 sqlite3,再学习 ORM。因为 ORM 本质上也是帮你生成和执行 SQL,如果完全不了解 SQL,后面排查问题会比较困难。

十、完整 CRUD 演示代码

下面是一份完整示例代码,包含创建数据库、创建数据表、插入数据、查询数据、修改数据、删除数据,以及一个简单的对象转换示例。

你可以保存为 sqlite_crud_demo.py 后直接运行。

import sqlite3
from dataclasses import dataclass


DB_NAME = "app.db"


@dataclass
class User:
    id: int
    name: str
    age: int
    email: str
    created_at: str


def get_connection():
    return sqlite3.connect(DB_NAME)


def create_table():
    conn = get_connection()
    cursor = conn.cursor()

    sql = """
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER,
        email TEXT UNIQUE,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP
    )
    """

    cursor.execute(sql)
    conn.commit()
    conn.close()


def insert_user(name, age, email):
    conn = get_connection()
    cursor = conn.cursor()

    try:
        cursor.execute(
            "INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
            (name, age, email)
        )
        conn.commit()
        print("插入成功,用户 ID:", cursor.lastrowid)
    except sqlite3.Error as e:
        conn.rollback()
        print("插入失败:", e)
    finally:
        conn.close()


def insert_many_users(users):
    conn = get_connection()
    cursor = conn.cursor()

    try:
        cursor.executemany(
            "INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
            users
        )
        conn.commit()
        print("批量插入成功")
    except sqlite3.Error as e:
        conn.rollback()
        print("批量插入失败:", e)
    finally:
        conn.close()


def query_all_users():
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute("SELECT id, name, age, email, created_at FROM users")
    rows = cursor.fetchall()
    conn.close()

    return [User(*row) for row in rows]


def query_user_by_id(user_id):
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute(
        "SELECT id, name, age, email, created_at FROM users WHERE id = ?",
        (user_id,)
    )
    row = cursor.fetchone()
    conn.close()

    if row is None:
        return None

    return User(*row)


def update_user_age(user_id, new_age):
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute(
        "UPDATE users SET age = ? WHERE id = ?",
        (new_age, user_id)
    )
    conn.commit()

    if cursor.rowcount == 0:
        print("没有找到要修改的用户")
    else:
        print("修改成功")

    conn.close()


def delete_user(user_id):
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute("DELETE FROM users WHERE id = ?", (user_id,))
    conn.commit()

    if cursor.rowcount == 0:
        print("没有找到要删除的用户")
    else:
        print("删除成功")

    conn.close()


def print_users(users):
    for user in users:
        print(
            f"ID: {user.id}, 姓名: {user.name}, 年龄: {user.age}, "
            f"邮箱: {user.email}, 创建时间: {user.created_at}"
        )


if __name__ == "__main__":
    create_table()

    insert_user("张三", 22, "zhangsan@example.com")

    insert_many_users([
        ("李四", 25, "lisi@example.com"),
        ("王五", 28, "wangwu@example.com"),
        ("赵六", 30, "zhaoliu@example.com")
    ])

    print("\n查询所有用户:")
    users = query_all_users()
    print_users(users)

    print("\n查询 ID 为 1 的用户:")
    user = query_user_by_id(1)
    print(user)

    print("\n修改 ID 为 1 的用户年龄:")
    update_user_age(1, 23)

    print("\n修改后的用户列表:")
    users = query_all_users()
    print_users(users)

    print("\n删除 ID 为 2 的用户:")
    delete_user(2)

    print("\n删除后的用户列表:")
    users = query_all_users()
    print_users(users)

十一、代码运行说明

运行代码:

python sqlite_crud_demo.py

第一次运行后,当前目录下会生成:

app.db

这个文件就是 SQLite 数据库文件。

如果重复运行示例代码,可能会因为 email 字段设置了唯一约束而出现类似错误:

UNIQUE constraint failed: users.email

这是正常现象,说明同一个邮箱不能重复插入。测试时可以删除 app.db 后重新运行,或者修改示例中的邮箱地址。

十二、后端初学者需要掌握的重点

学习 sqlite3 时,建议重点掌握下面几个点:

对于后端开发来说,数据库操作不仅仅是会写 SQL,还要注意安全性和稳定性。例如参数化 SQL 可以降低 SQL 注入风险,事务处理可以避免数据写入一半就失败的问题。

十三、总结

本文通过 Python 标准库 sqlite3 演示了本地 SQLite 数据库的基本操作,包括:

对于 Python 后端初学者来说,SQLite 是非常适合作为第一门数据库实践工具的。它不需要安装数据库服务,只需要一个 .db 文件就能完成完整的数据增删改查。掌握这些基础之后,再学习 MySQL、PostgreSQL、SQLAlchemy 或 Django ORM,会更加顺畅。

以上就是Python+sqlite3操作本地SQLite数据库的实战指南的详细内容,更多关于Python sqlite3操作SQLite数据库的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文