Python SQLite 教程:如何连接与操作数据库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Python 操作 SQLite:从入门到进阶的完整指南

在应用开发中,数据库操作是核心任务之一。如果你需要一个轻量级、无需安装独立服务器的嵌入式数据库解决方案,SQLite 将是你的理想选择。

结合 Python 标准库中的 sqlite3 模块,你可以直接在代码中快速创建、修改和管理数据库。本文将教你如何连接 SQLite、执行数据插入(INSERT)、更新(UPDATE)等操作,并附有详细代码示例。

什么是 SQLite?为什么选择它?

SQLite 是一种嵌入式关系型数据库,所有数据存储在一个单一文件中。它无需独立服务器,非常适合原型开发、小型项目和移动应用。

SQLite 广泛应用于软件开发领域。许多流行应用,包括浏览器、即时通讯工具和移动应用,都使用 SQLite 进行本地数据存储。

SQLite 的优势

  • 无需安装服务器
  • 运行速度快
  • 使用简单
  • 通过 sqlite3 模块与 Python 完美集成
  • 跨平台且便携
  • 支持 ACID 事务
  • 资源消耗极低

SQLite 的局限性

  • 不支持多用户并发写入
  • 处理大数据量时性能有限
  • 缺乏内置复制功能
  • 复杂多用户应用场景受限

在 Python 中连接 SQLite 数据库

基本连接

import sqlite3

# 连接数据库(如果文件不存在,则自动创建)
conn = sqlite3.connect('my_database.db')

# 创建游标对象以执行 SQL 查询
cursor = conn.cursor()

连接内存数据库

如需临时存储数据或进行测试,可使用内存数据库:

conn = sqlite3.connect(':memory:')

配置连接参数

conn = sqlite3.connect('my_database.db', timeout=10)
conn.execute('PRAGMA foreign_keys = ON')  # 启用外键约束

在 SQLite 中创建表

创建简单表

cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER
    )
''')
conn.commit()

创建带约束的表

cursor.execute('''
    CREATE TABLE IF NOT EXISTS products (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL UNIQUE,
        price REAL CHECK(price > 0),
        category TEXT DEFAULT 'uncategorized',
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
''')
conn.commit()

创建索引以优化查询

cursor.execute('''
    CREATE INDEX IF NOT EXISTS idx_users_name ON users(name)
''')
conn.commit()

向表中插入数据 —— Python sqlite3 INSERT 操作

插入单条记录

最常见的操作之一是如何向 SQLite 表中插入数据:

cursor.execute('''
    INSERT INTO users (name, age) VALUES (?, ?)
''', ('张三', 30))
conn.commit()

使用问号占位符可有效防止 SQL 注入,是推荐的做法。

批量插入数据

users = [('李四', 25), ('王五', 28), ('赵六', 35)]
cursor.executemany('''
    INSERT INTO users (name, age) VALUES (?, ?)
''', users)
conn.commit()

查询数据 —— Python sqlite3 SELECT 操作

查询所有数据

cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:
    print(row)

带条件查询

cursor.execute('SELECT * FROM users WHERE age > ?', (25,))
rows = cursor.fetchall()
for row in rows:
    print(row)

使用 fetchone 和 fetchmany

# 获取单条记录
row = cursor.fetchone()
print(row)

# 获取指定数量的记录
rows = cursor.fetchmany(5)
print(rows)

更新数据 —— Python sqlite3 UPDATE 操作

cursor.execute('''
    UPDATE users SET age = ? WHERE name = ?
''', (31, '张三'))
conn.commit()

删除数据 —— Python sqlite3 DELETE 操作

cursor.execute('''
    DELETE FROM users WHERE name = ?
''', ('张三',))
conn.commit()

事务管理

SQLite 支持事务,确保数据一致性:

try:
    conn.execute('BEGIN TRANSACTION')
    cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('测试用户', 20))
    cursor.execute('UPDATE users SET age = 21 WHERE name = ?', ('测试用户',))
    conn.commit()
except Exception as e:
    conn.rollback()
    print(f'事务回滚:{e}')

关闭连接

操作完成后,务必关闭游标和连接:

cursor.close()
conn.close()

常见问题与最佳实践

使用参数化查询防止 SQL 注入

始终使用问号占位符而非字符串拼接:

# 正确做法
cursor.execute('SELECT * FROM users WHERE name = ?', (user_input,))

# 错误做法(易受 SQL 注入攻击)
cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")

使用 with 语句自动管理资源

with sqlite3.connect('my_database.db') as conn:
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM users')
    rows = cursor.fetchall()
    for row in rows:
        print(row)

优化查询性能

  • 为常用查询字段创建索引
  • 避免在 WHERE 子句中对列使用函数
  • 使用 EXPLAIN QUERY PLAN 分析查询
  • 批量操作时使用 executemany

总结

本文详细介绍了如何在 Python 中使用 SQLite 数据库,包括连接、创建表、插入、查询、更新和删除数据等核心操作。SQLite 结合 Python 的 sqlite3 模块,为开发者提供了一个轻量、高效且易于使用的数据库解决方案。无论是学习编程还是开发实际项目,掌握 SQLite 操作都是一项重要技能。

希望本教程对你有所帮助!如有任何问题,欢迎在评论区留言交流。

博客

书籍推荐