SQLite 是一个轻量级的、基于文件的嵌入式数据库引擎,它不需要单独的服务器进程,这使得它非常适合小型应用、移动应用、桌面应用以及作为原型开发的工具。

核心步骤
在 Python 中使用 SQLite 主要分为以下几个步骤:
- 导入
sqlite3模块:Python 标准库自带了这个模块,无需额外安装。 - 连接到数据库:
- 如果数据库文件(
.db)存在,则连接到它。 - 如果数据库文件不存在,SQLite 会自动创建一个新的数据库文件。
- 如果数据库文件(
- 创建一个游标:游标就像一个指针,允许你执行 SQL 命令并获取结果。
- 编写并执行 SQL 命令:使用游标的
execute()方法来创建表、插入数据、查询数据等。 - 提交更改:对于写操作(如
INSERT,UPDATE,DELETE),必须调用连接对象的commit()方法,否则更改不会被保存到数据库文件中。 - 关闭连接:操作完成后,关闭游标和连接,释放资源。
示例1:创建数据库、表并插入数据
这是一个完整的、从零开始的示例,展示了如何创建一个名为 mydatabase.db 的数据库,并在其中创建一个 users 表。
import sqlite3
# 1. 连接到数据库
# mydatabase.db 文件不存在,它会被自动创建
# 如果文件已存在,则连接到该数据库
try:
# connection 对象表示数据库连接
connection = sqlite3.connect('mydatabase.db')
# 2. 创建一个游标对象
# cursor 对象用于执行 SQL 命令
cursor = connection.cursor()
# 3. 创建一个表
# 使用 CREATE TABLE IF NOT EXISTS 避免重复创建时出错
print("正在创建表...")
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
age INTEGER
)
''')
print("表 'users' 创建成功或已存在。")
# 4. 向表中插入数据
# 使用 ? 作为占位符,可以防止 SQL 注入攻击,这是推荐的做法
print("正在插入数据...")
new_users = [
('Alice', 'alice@example.com', 30),
('Bob', 'bob@example.com', 25),
('Charlie', 'charlie@example.com', 35)
]
# executemany() 用于批量插入
cursor.executemany("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", new_users)
# 5. 提交更改
# 对于写操作,必须调用 commit() 来保存更改
connection.commit()
print(f"成功插入了 {cursor.rowcount} 条数据。")
except sqlite3.Error as e:
print(f"数据库错误: {e}")
finally:
# 6. 关闭游标和连接
# 确保无论是否发生错误,资源都会被正确释放
if connection:
cursor.close()
connection.close()
print("数据库连接已关闭。")
执行后,你会看到在你的 Python 脚本同目录下,生成了一个 mydatabase.db 文件。
示例2:查询数据
现在我们来查询刚刚创建的 users 表中的数据。

import sqlite3
# 连接到已存在的数据库
try:
connection = sqlite3.connect('mydatabase.db')
cursor = connection.cursor()
# 执行 SELECT 查询
print("正在查询所有用户...")
cursor.execute("SELECT id, name, email, age FROM users")
# 获取查询结果
# fetchall() 获取所有行,返回一个元组列表
users = cursor.fetchall()
# 打印结果
print("用户列表:")
for user in users:
print(f"ID: {user[0]}, 姓名: {user[1]}, 邮箱: {user[2]}, 年龄: {user[3]}")
except sqlite3.Error as e:
print(f"数据库错误: {e}")
finally:
if connection:
cursor.close()
connection.close()
print("数据库连接已关闭。")
输出:
正在查询所有用户...
用户列表:
ID: 1, 姓名: Alice, 邮箱: alice@example.com, 年龄: 30
ID: 2, 姓名: Bob, 邮箱: bob@example.com, 年龄: 25
ID: 3, 姓名: Charlie, 邮箱: charlie@example.com, 年龄: 35
数据库连接已关闭。
重要概念和最佳实践
使用 with 语句(推荐)
with 语句可以自动管理资源,即使发生异常,也能确保连接被正确关闭,这比手动 try...finally 更简洁。
import sqlite3
# with 语句会自动处理连接的打开和关闭
with sqlite3.connect('mydatabase.db') as connection:
cursor = connection.cursor()
# 执行操作
cursor.execute("SELECT name FROM users WHERE age > 28")
older_users = cursor.fetchall()
print("年龄大于28的用户:")
for user in older_users:
print(user[0])
# 不需要手动调用 connection.close()
# with 语句块结束时,连接会自动关闭
参数化查询(防止 SQL 注入)
永远不要使用 Python 的字符串格式化(如 f"..." 或 )来构建 SQL 查询,这会导致严重的SQL 注入安全漏洞。
错误的做法 (危险!):

user_name = "Alice"
# 不要这样做!
sql = f"SELECT * FROM users WHERE name = '{user_name}'"
cursor.execute(sql)
正确的做法 (安全!):
使用 作为占位符,并将参数作为元组传递给 execute() 方法。
user_name = "Alice" # 使用 ? 作为占位符 sql = "SELECT * FROM users WHERE name = ?" # 参数作为元组传递 cursor.execute(sql, (user_name,)) # 注意:即使只有一个参数,也必须写成元组形式 (user_name,)
获取数据的其他方法
fetchone(): 获取查询结果的第一行,返回一个元组,如果结果为空,则返回None。fetchmany(size): 获取指定数量的行,返回一个元组列表。
with sqlite3.connect('mydatabase.db') as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print("--- 使用 fetchone() ---")
first_user = cursor.fetchone()
print("第一个用户:", first_user)
print("\n--- 使用 fetchmany(2) ---")
next_two_users = cursor.fetchmany(2)
print("接下来的两个用户:", next_two_users)
将查询结果转换为字典
默认情况下,fetchall() 返回的是元组,如果你想通过列名来访问数据,可以使用 sqlite3.Row 对象。
import sqlite3
# 将 row_factory 设置为 sqlite3.Row
# 这样,游标就会返回字典一样的行对象
with sqlite3.connect('mydatabase.db') as connection:
connection.row_factory = sqlite3.Row
cursor = connection.cursor()
cursor.execute("SELECT * FROM users WHERE name = 'Bob'")
bob = cursor.fetchone() # fetchone() 返回一个 Row 对象
if bob:
# 现在可以通过列名访问数据,就像字典一样
print(f"Bob 的邮箱: {bob['email']}")
print(f"Bob 的年龄: {bob['age']}")
| 步骤 | 代码 | 说明 |
|---|---|---|
| 导入 | import sqlite3 |
加载 Python 的 SQLite 模块。 |
| 连接 | conn = sqlite3.connect('mydb.db') |
连接或创建数据库文件。 |
| 创建游标 | cursor = conn.cursor() |
获取一个执行 SQL 命令的对象。 |
| 执行 SQL | cursor.execute("CREATE TABLE ...") |
使用游标执行 SQL 语句。 |
| 提交 | conn.commit() |
仅对写操作:保存更改到磁盘。 |
| 关闭 | cursor.close()conn.close() |
释放资源,使用 with 语句可自动完成。 |
遵循这些步骤和最佳实践,你就可以在 Python 中安全、高效地使用 SQLite 数据库了。
