首页 > 解决方案 > 如何检查 django sqlite3 数据库?

问题描述

我有一个使用 WAL 的 sqlite3 django 数据库。在操作中,通常存在三个文件:db.sqlite3, db.sqlite3-shm, db.sqlite3-wal.

为了方便地备份数据库(当服务停止时),我想创建一个管理命令来检查 sqlite 数据库,以便将所有更改写入db.sqlite3并删除其他两个文件。

虽然 sqlite3 有一个检查点 API,但我不知道如何从 django(或python 的 sqlite3 模块)访问它

标签: pythondjangosqlite

解决方案


经过大量挖掘,您可以使用编译指示:

from django.core.management.base import BaseCommand
from django.db import connection


class Command(BaseCommand):
    help = 'Checkpoint the database, updating <db>.sqlite3 and removing <db>.sqlite3-wal and <db>.sqlite3-shm files'

    def add_arguments(self, parser):
        parser.add_argument('-cm', '--checkpoint_mode', default='TRUNCATE',
                            choices=['PASSIVE', 'FULL', 'RESTART', 'TRUNCATE'],
                            help='Checkpoint mode - See sqlite3 documentation for options (default is TRUNCATE)')

    def handle(self, *args, **options):
        with connection.cursor() as cursor:
            cursor.execute(f"PRAGMA wal_checkpoint({options['checkpoint_mode']});")
            result = cursor.fetchone()
        print(f'{result}')

推荐阅读