Python sqlite3.connect 函数
上次修改时间:2025 年 4 月 15 日
这份全面的指南探讨了 Python 的 sqlite3.connect
函数,它是与 SQLite 数据库交互的主要方式。我们将介绍基本用法、连接参数、隔离级别和实际示例。
基本定义
sqlite3.connect
函数建立与 SQLite 数据库的连接。如果数据库文件不存在,它会创建一个新的数据库文件,否则打开一个现有的数据库文件。
主要特点:它返回一个连接对象,接受各种参数来控制行为,并管理事务。连接是 SQLite 中所有数据库操作的入口。
基本数据库连接
以下是 sqlite3.connect
的最简单用法,用于创建或打开数据库文件并执行基本操作。
import sqlite3 # Connect to database (creates if doesn't exist) with sqlite3.connect('example.db') as conn: cursor = conn.cursor() # Create a table cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''') # Insert data cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30)) # Commit is automatic with context manager
此示例显示了使用上下文管理器的基本工作流程。如果数据库文件“example.db”不存在,则在当前目录中创建它。
with
语句确保连接正确关闭,并且在块成功退出时自动提交更改。
将连接与游标作为上下文管理器一起使用
连接和游标都可以用作上下文管理器,以实现更简洁的资源管理。
import sqlite3 with sqlite3.connect('example.db') as conn: with conn.cursor() as cursor: cursor.execute("SELECT * FROM users") rows = cursor.fetchall() for row in rows: print(row)
此示例演示了连接和游标的嵌套上下文管理器。游标在其块退出时自动关闭。
当处理多个游标或复杂的事务序列时,此模式特别有用,可确保所有资源都得到正确释放。
带有上下文管理器的内存数据库
SQLite 支持内存数据库,它速度快但临时,非常适合测试。
import sqlite3 with sqlite3.connect(':memory:') as conn: with conn.cursor() as cursor: cursor.execute('''CREATE TABLE test (id INTEGER, data TEXT)''') cursor.execute("INSERT INTO test VALUES (1, 'Sample')") cursor.execute("SELECT * FROM test") print(cursor.fetchone()) # (1, 'Sample')
特殊的 :memory:
文件名在 RAM 中创建一个数据库。它比基于磁盘的数据库快得多,但在连接关闭时消失。
即使在操作过程中发生错误,上下文管理器也能确保正确清理内存数据库。
具有隔离级别的连接
isolation_level 参数控制 SQLite 的事务行为。此示例展示了如何将不同的隔离级别与上下文管理器一起使用。
import sqlite3 # Connect with explicit isolation level with sqlite3.connect('transactions.db', isolation_level='IMMEDIATE') as conn: with conn.cursor() as cursor: cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1") cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")
此示例使用 IMMEDIATE
隔离级别,该级别会在写入时立即锁定数据库。上下文管理器自动处理提交/回滚。
如果在事务期间发生任何错误,上下文管理器将在关闭连接之前自动回滚更改。
带有上下文管理器的自定义行工厂
row_factory
参数允许自定义返回行的方式,从而可以通过列名访问。
import sqlite3 with sqlite3.connect('example.db') as conn: conn.row_factory = sqlite3.Row # Built-in row factory with conn.cursor() as cursor: cursor.execute("SELECT * FROM users LIMIT 1") row = cursor.fetchone() print(row['name']) # Access by column name
此示例使用 SQLite 的内置 Row
工厂,该工厂提供对列的命名访问。上下文管理器确保正确清理资源。
命名访问提高了代码的可读性和可维护性,尤其是在查询返回许多列或模式可能更改时。
具有超时的连接
timeout
参数指定当数据库被另一个连接锁定时要等待的时间。
import sqlite3 try: # Connect with 5 second timeout with sqlite3.connect('busy.db', timeout=5.0) as conn: with conn.cursor() as cursor: cursor.execute("UPDATE counters SET value = value + 1 WHERE id = 1") except sqlite3.OperationalError as e: print("Database locked beyond timeout:", e)
如果数据库被另一个进程锁定,此连接将最多等待 5 秒钟。上下文管理器处理连接生命周期。
超时在可能发生数据库争用的多进程应用程序中尤其重要。try/except 处理超时错误。
带有上下文管理器的 URI 连接
uri
参数通过 URI 格式的连接字符串启用高级连接选项。
import sqlite3 # Connect with URI parameters uri = 'file:app.db?mode=rwc&cache=shared' with sqlite3.connect(uri, uri=True, timeout=10) as conn: with conn.cursor() as cursor: cursor.execute("PRAGMA journal_mode=WAL") cursor.execute("SELECT * FROM config") print(cursor.fetchall())
此示例显示了带有模式、缓存和超时参数的 URI 连接。上下文管理器确保正确清理资源。
URI 连接支持许多通过常规连接字符串无法使用的配置选项,从而可以更好地控制数据库行为。
最佳实践
- 始终使用上下文管理器: 用于自动资源清理
- 选择适当的隔离级别: 将隔离级别与用例匹配
- 正确处理错误: 捕获特定的 SQLite 异常
- 使用参数化查询: 避免 SQL 注入
- 考虑连接池: 对于高性能应用程序
资料来源
作者
列出所有 Python 教程。