ZetCode

Python sqlite3.Connection.backup 方法

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

本综合指南探讨了 Python 的 sqlite3.Connection.backup 方法,用于创建 SQLite 数据库备份。我们将介绍基本用法、参数、进度跟踪和实际示例。

基本定义

backup 方法创建 SQLite 数据库的备份副本。 它执行在线备份,这意味着源数据库可以在备份过程中使用。

主要特点:它在数据库使用时工作,支持进度回调,并且可以备份到内存或磁盘。 该方法是原子性和一致性的。

基本数据库备份

这是 backup 的最简单用法,用于创建数据库的副本。

basic_backup.py
import sqlite3

# Connect to source and destination databases
with sqlite3.connect('source.db') as src_conn:
    with sqlite3.connect('backup.db') as dest_conn:
        
        # Perform the backup
        src_conn.backup(dest_conn)
        
        print("Backup completed successfully")

此示例创建一个从“source.db”到“backup.db”的完整副本。 两个连接都使用上下文管理器进行管理,以便自动清理。

备份在单个事务中执行,即使在备份期间修改源数据库,也能确保一致性。

带有进度回调的备份

备份方法支持进度回调以监视备份过程。

progress_callback.py
import sqlite3

def progress(status, remaining, total):
    print(f'Copied {total-remaining} of {total} pages...')

with sqlite3.connect('large_db.db') as src_conn:
    with sqlite3.connect('backup_large.db') as dest_conn:
        
        # Backup with progress callback
        src_conn.backup(dest_conn, pages=5, progress=progress)
        
        print("Backup completed with progress tracking")

回调接收三个参数:状态(未使用)、剩余页数和总页数。“pages”参数控制在回调之间复制多少页。

这对于大型数据库非常有用,在这种情况下,您希望提供用户反馈或实现取消逻辑。

部分数据库备份

您可以使用“name”参数备份特定表或模式。

partial_backup.py
import sqlite3

with sqlite3.connect('production.db') as src_conn:
    with sqlite3.connect('backup_customers.db') as dest_conn:
        
        # Backup only the 'customers' table
        src_conn.backup(dest_conn, name='main', 
                       pages=1, name_dest='main')
        
        # Verify the backup
        cursor = dest_conn.cursor()
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
        print("Tables in backup:", cursor.fetchall())

此示例仅备份主数据库模式。 如果需要,您可以指定不同的源和目标模式名称。

当您只需要保留特定数据或使用附加数据库时,部分备份非常有用。

备份到内存数据库

备份方法可以将数据复制到内存数据库以进行临时处理。

memory_backup.py
import sqlite3

with sqlite3.connect('important.db') as src_conn:
    with sqlite3.connect(':memory:') as mem_conn:
        
        # Backup to memory database
        src_conn.backup(mem_conn)
        
        # Work with the in-memory copy
        cursor = mem_conn.cursor()
        cursor.execute("SELECT COUNT(*) FROM sensitive_data")
        count = cursor.fetchone()[0]
        print(f"Backup contains {count} records")

这将创建一个数据库的临时内存副本。 连接关闭时,内存数据库将消失。

内存备份对于敏感数据处理或需要快速临时访问数据库内容时非常有用。

具有自定义页面大小的备份

通过指定一次复制多少页来控制备份粒度。

page_size.py
import sqlite3

def progress(status, remaining, total):
    if remaining % 100 == 0:
        print(f'{remaining} pages remaining')

with sqlite3.connect('big_data.db') as src_conn:
    with sqlite3.connect('incremental_backup.db') as dest_conn:
        
        # Backup 100 pages at a time
        src_conn.backup(dest_conn, pages=100, progress=progress)
        
        print("Incremental backup completed")

较小的页面大小允许更频繁的进度更新,但可能会降低性能。 较大的页面大小更快,但提供的更新频率较低。

选择一个页面大小,以平衡性能和您对进度反馈的需求。

具有错误处理的备份

实现适当的错误处理以优雅地管理备份失败。

error_handling.py
import sqlite3
import os

try:
    # Remove old backup if exists
    if os.path.exists('backup_fail.db'):
        os.remove('backup_fail.db')
    
    with sqlite3.connect('source.db') as src_conn:
        with sqlite3.connect('backup_fail.db') as dest_conn:
            
            try:
                src_conn.backup(dest_conn)
                print("Backup succeeded")
            except sqlite3.Error as e:
                print("Backup failed:", e)
                if os.path.exists('backup_fail.db'):
                    os.remove('backup_fail.db')
                
except Exception as e:
    print("General error:", e)

此示例显示了全面的错误处理,包括在操作失败时清理部分备份。

始终为生产备份实施错误处理,以避免系统处于不一致的状态。

带有附加数据库的备份

备份方法可以处理具有附加模式的数据库。

attached_backup.py
import sqlite3

with sqlite3.connect('main.db') as conn:
    # Attach another database
    conn.execute("ATTACH DATABASE 'auxiliary.db' AS aux")
    
    with sqlite3.connect('full_backup.db') as backup_conn:
        # Backup both main and attached database
        conn.backup(backup_conn, name='main')
        conn.backup(backup_conn, name='aux')
        
        print("Backup of main and attached databases completed")

此示例显示如何备份主数据库和附加数据库。 每个模式都需要单独的备份调用。

使用附加数据库时,请记住备份需要保留的所有模式。

最佳实践

资料来源

作者

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

列出所有 Python 教程