《分享Python3连接SQLite实例代码》
SQLite作为一种轻量级的嵌入式数据库,因其零配置、无需服务器、跨平台等特性,在Python开发中被广泛用于小型项目、原型开发及移动应用等场景。Python3通过内置的sqlite3模块提供了对SQLite数据库的完整支持,开发者无需安装额外依赖即可实现数据库的创建、连接、查询及事务管理。本文将通过完整的实例代码,详细讲解Python3连接SQLite数据库的完整流程,涵盖从基础连接到高级操作的各个方面。
一、SQLite数据库基础
SQLite是一个开源的、基于磁盘的关系型数据库引擎,其数据存储在单个文件中(如test.db),支持标准的SQL语法。与MySQL、PostgreSQL等客户端-服务器架构的数据库不同,SQLite的数据库引擎直接嵌入在应用程序中,通过文件I/O操作读写数据。这种设计使得SQLite具有以下优势:
零配置:无需安装服务、配置权限或创建用户。
跨平台:同一数据库文件可在Windows、Linux、macOS等系统间共享。
轻量级:核心引擎仅约500KB,适合资源受限的环境(如移动设备)。
事务支持:满足ACID特性,保证数据一致性。
二、Python3连接SQLite的完整流程
Python3的sqlite3模块提供了完整的SQLite操作接口,其核心步骤包括:导入模块、连接数据库、创建游标、执行SQL语句、提交/回滚事务、关闭连接。以下通过实例代码逐步演示。
1. 导入sqlite3模块
import sqlite3
sqlite3是Python标准库的一部分,无需额外安装。若使用更高级的功能(如类型适配),可进一步导入sqlite3.adapters模块。
2. 连接数据库
通过sqlite3.connect()方法建立与数据库的连接。若数据库文件不存在,则会自动创建;若存在,则直接打开。
# 连接数据库(若test.db不存在则创建)
conn = sqlite3.connect('test.db')
参数说明:
database:数据库文件路径(相对或绝对路径)。
timeout:等待锁释放的超时时间(秒),默认5.0。
detect_types:启用类型检测(如sqlite3.PARSE_DECLTYPES)。
isolation_level:事务隔离级别(如None表示自动提交模式)。
3. 创建游标对象
游标(Cursor)是执行SQL语句和获取结果的核心对象,通过连接对象的cursor()方法创建。
cursor = conn.cursor()
游标的主要方法:
execute():执行单条SQL语句。
executemany():批量执行参数化SQL。
executescript():执行多条SQL脚本(自动分号分隔)。
fetchone():获取单行结果。
fetchmany(size):获取指定行数的结果。
fetchall():获取所有结果。
4. 创建表并插入数据
以下代码演示如何创建用户表并插入示例数据:
# 创建用户表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE
)
''')
# 插入单条数据
cursor.execute(
"INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
('Alice', 25, 'alice@example.com')
)
# 插入多条数据(使用executemany)
users_data = [
('Bob', 30, 'bob@example.com'),
('Charlie', 22, 'charlie@example.com'),
('David', 28, 'david@example.com')
]
cursor.executemany(
"INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
users_data
)
参数化查询(?占位符)可有效防止SQL注入攻击,避免直接拼接SQL字符串。
5. 查询数据
通过SELECT语句查询数据,并使用fetch方法获取结果:
# 查询所有用户
cursor.execute("SELECT * FROM users")
all_users = cursor.fetchall()
print("所有用户:")
for user in all_users:
print(user)
# 查询特定条件的用户(年龄大于25)
cursor.execute(
"SELECT name, email FROM users WHERE age > ?",
(25,)
)
filtered_users = cursor.fetchall()
print("\n年龄大于25的用户:")
for user in filtered_users:
print(f"姓名: {user[0]}, 邮箱: {user[1]}")
6. 更新与删除数据
# 更新用户年龄
cursor.execute(
"UPDATE users SET age = ? WHERE name = ?",
(26, 'Alice')
)
# 删除用户
cursor.execute(
"DELETE FROM users WHERE name = ?",
('David',)
)
7. 事务管理
SQLite默认开启事务,需通过commit()提交或rollback()回滚:
try:
# 执行多个操作
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Eve', 35))
cursor.execute("UPDATE users SET age = age + 1 WHERE name = 'Bob'")
# 提交事务
conn.commit()
print("事务提交成功")
except sqlite3.Error as e:
# 发生错误时回滚
conn.rollback()
print(f"事务回滚,错误:{e}")
8. 关闭连接
操作完成后必须关闭连接以释放资源:
cursor.close() # 先关闭游标
conn.close() # 再关闭连接
或使用上下文管理器(推荐):
with sqlite3.connect('test.db') as conn:
cursor = conn.cursor()
# 执行操作
# 无需显式调用close(),上下文退出时自动关闭
三、高级功能与最佳实践
1. 使用上下文管理器
通过with语句自动管理连接和游标的生命周期,避免资源泄漏:
with sqlite3.connect('test.db') as conn:
with conn: # 嵌套上下文,自动提交或回滚
cursor = conn.cursor()
cursor.execute("INSERT INTO users (name) VALUES (?)", ('Frank',))
2. 行工厂与类型适配
自定义行工厂可将查询结果转换为字典或其他对象:
def dict_factory(cursor, row):
d = {}
for idx, col in enumerate(cursor.description):
d[col[0]] = row[idx]
return d
conn.row_factory = dict_factory
cursor = conn.cursor()
cursor.execute("SELECT * FROM users LIMIT 1")
user = cursor.fetchone()
print(user) # 输出:{'id': 1, 'name': 'Alice', ...}
3. 错误处理
捕获sqlite3.Error及其子类(如IntegrityError、OperationalError):
try:
conn = sqlite3.connect('test.db')
# 操作数据库
except sqlite3.Error as e:
print(f"数据库错误:{e}")
finally:
if conn:
conn.close()
4. 性能优化
批量操作:使用executemany()替代循环execute()。
事务分组:将多个操作放在一个事务中减少I/O。
索引优化:为常用查询条件创建索引。
四、完整实例代码
以下是一个完整的Python3连接SQLite的示例,包含创建表、插入、查询、更新、删除及事务管理:
import sqlite3
from contextlib import closing
def main():
# 使用上下文管理器连接数据库
with closing(sqlite3.connect('example.db')) as conn:
# 设置行工厂为字典类型
conn.row_factory = sqlite3.Row
# 创建游标
cursor = conn.cursor()
try:
# 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
price REAL,
stock INTEGER DEFAULT 0
)
''')
# 插入数据
products = [
('Laptop', 999.99, 10),
('Mouse', 19.99, 50),
('Keyboard', 49.99, 30)
]
cursor.executemany(
"INSERT INTO products (name, price, stock) VALUES (?, ?, ?)",
products
)
# 查询数据
print("所有产品:")
cursor.execute("SELECT * FROM products")
for row in cursor.fetchall():
print(dict(row)) # 转换为字典输出
# 更新数据
cursor.execute(
"UPDATE products SET price = ? WHERE name = ?",
(24.99, 'Keyboard')
)
# 条件查询
print("\n库存少于20的产品:")
cursor.execute(
"SELECT name, stock FROM products WHERE stock
五、总结与扩展
本文通过实例代码详细展示了Python3连接SQLite数据库的全流程,包括基础操作、事务管理、高级功能及最佳实践。SQLite因其轻量级和易用性,非常适合小型项目或原型开发。对于更复杂的场景,可结合SQLAlchemy等ORM工具进一步提升开发效率。
扩展方向:
使用SQLite的WAL模式(Write-Ahead Logging)提升并发性能。
通过APSW库访问SQLite的C接口,实现更底层控制。
将SQLite与Pandas结合,实现数据分析与持久化的无缝集成。
关键词:Python3、SQLite、数据库连接、参数化查询、事务管理、上下文管理器、类型适配、实例代码
简介:本文详细介绍了Python3通过内置sqlite3模块连接SQLite数据库的完整流程,涵盖从基础连接到高级操作的实例代码,包括创建表、插入数据、查询、更新、删除及事务管理,同时提供了上下文管理器、行工厂、错误处理等最佳实践,适合Python开发者快速掌握SQLite数据库操作。