ZetCode

Python sqlite3.connect 函数

上次修改时间:2025 年 4 月 15 日

这份全面的指南探讨了 Python 的 sqlite3.connect 函数,它是与 SQLite 数据库交互的主要方式。我们将介绍基本用法、连接参数、隔离级别和实际示例。

基本定义

sqlite3.connect 函数建立与 SQLite 数据库的连接。如果数据库文件不存在,它会创建一个新的数据库文件,否则打开一个现有的数据库文件。

主要特点:它返回一个连接对象,接受各种参数来控制行为,并管理事务。连接是 SQLite 中所有数据库操作的入口。

基本数据库连接

以下是 sqlite3.connect 的最简单用法,用于创建或打开数据库文件并执行基本操作。

basic_connect.py
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 语句确保连接正确关闭,并且在块成功退出时自动提交更改。

将连接与游标作为上下文管理器一起使用

连接和游标都可以用作上下文管理器,以实现更简洁的资源管理。

cursor_context.py
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 支持内存数据库,它速度快但临时,非常适合测试。

memory_context.py
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 的事务行为。此示例展示了如何将不同的隔离级别与上下文管理器一起使用。

isolation_context.py
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 参数允许自定义返回行的方式,从而可以通过列名访问。

row_factory_context.py
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 参数指定当数据库被另一个连接锁定时要等待的时间。

timeout_context.py
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 格式的连接字符串启用高级连接选项。

uri_context.py
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 连接支持许多通过常规连接字符串无法使用的配置选项,从而可以更好地控制数据库行为。

最佳实践

资料来源

作者

我叫 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 Python 教程