完整的Django数据库重置

20

如何完全重置我的 Django(1.2 alpha)数据库(删除所有表而不是只清除它们)?

manage.py flush 功能过于简单(如果有模式更改则无法工作),而 manage.py reset 需要我指定所有应用程序(似乎需要一个与 " ".join(INSTALLED_APPS) 不同的格式)。显然,我可以以特定于数据库的方式实现此目的,但我想必须有一种明智、不受 DB 后端影响的方法来实现这一点。

[编辑:我正在寻找可以从脚本(如 Makefile)调用并且在更改后端 DB 或添加到 settings.INSTALLED_APPS 时仍然可用的解决方案。]

7个回答

21

8
建议安装Django命令扩展以获取reset_db和其他好处:http://code.google.com/p/django-command-extensions/ - Adam Nelson
4
只需执行以下命令: pip install django-extensions,然后运行 python manage.py reset_db - abstraktor
7
补充 @abstraktor 的评论:在输入 python manage.py reset_db 命令之前,您需要在项目中启用 django_extensions 插件,将其添加到项目的 settings.py 文件的 INSTALLED_APPS 列表中:INSTALLED_APPS = ( ... 'django_extensions', ... )查看文档 - Gengiolo
Django命令扩展可能是实现此目的的最理想方式。 - Rafay
这是黄金答案。它简单而甜美。 - Mo1

1

你想要 sqlreset

% python manage.py help sqlreset
Usage: manage.py sqlreset [options] <appname appname ...>

Prints the DROP TABLE SQL, then the CREATE TABLE SQL, for the given app name(s).

Options:
  -v VERBOSITY, --verbosity=VERBOSITY
                        Verbosity level; 0=minimal output, 1=normal output,
                        2=all output
  --settings=SETTINGS   The Python path to a settings module, e.g.
                        "myproject.settings.main". If this isn't provided, the
                        DJANGO_SETTINGS_MODULE environment variable will be
                        used.
  --pythonpath=PYTHONPATH
                        A directory to add to the Python path, e.g.
                        "/home/djangoprojects/myproject".
  --traceback           Print traceback on exception
  --version             show program's version number and exit
  -h, --help            show this help message and exit

就像在修改模型时一样,Django 不会自动为您执行此操作。它只会输出命令供您复制和粘贴。


上面提到的 manage.py reset 只是 sqlreset 的一个包装器,因此同样的问题也适用:我不想手动列出所有的应用程序名称。我需要一个可以自动化解决并且在我添加到 settings.py 中的 INSTALLED_APPS 后仍然能够正常工作的解决方案。 - as.
你需要自己编写脚本。我认为这个功能并不存在。 - jathanism

0

假设您(幸运地)处于Linux环境中,并且:

  • 使用MySQL并知道访问项目数据库的用户名/密码
  • 已安装bash、mysql和readlink
  • settings.py是settings.py
  • dbname与您的Django项目名称相同(请参见下面的MYAPP变量)
  • 您想要重置的所有应用程序都在INSTALLED_APPS中列出,以字符串形式表示其完全限定模块名称(以您的Django项目名称开头)

将当前文件夹更改为包含manage.py和settings.py的项目代码所在位置。然后运行以下命令:

MYAPP=$(basename $(dirname `readlink -m settings.py`));DJANGOAPPS=$(echo 'import settings; print " ".join([ str(app).lstrip("'${MYAPP}'.") for app in settings.INSTALLED_APPS if "'${MYAPP}'" in app ])' | python - ); python manage.py sqlreset $DJANGOAPPS | mysql -u root --password ${MYAPP}

如果你理解这个 Bash 单行命令的含义,那么在此基础上进行扩展(例如将其放入 Makefile)应该不是问题。

请注意,在Unix命令行世界中,像S.Lott建议的那样使用“echo 'DROP DATABASE dbx;' | mysql dbx”也是可行的。然后您只需调用syncdb即可。 - Yauhen Yakimovich

0

只需分配一个新数据库并从数据库控制台中删除此数据库。对我来说,这似乎是最简单的方法。


抱歉,我应该明确表明我需要可以自动化的东西。 - as.
@as:数据库删除怎么可能不能自动化?你用的是哪种数据库?编写一个 SQL 脚本 DROP DATABASE x; 并运行它即可。 - S.Lott

0

嗯,也许你在欺骗manage.py,假装创建fixture,但实际上只是在寻找应用程序:

apps=$(python manage.py makefixture 2>&1 | egrep -v '(^Error|^django)'|awk -F . '{print $2}'|uniq); for i in $apps; do python manage.py sqlreset $i; done| grep DROP

这将输出一个DROP TABLE语句列表,用于项目中所有应用程序表,不包括django表本身。如果您想包括它们,请从egrep中删除|^django模式。

但如何提供正确的数据库后端呢?通过settings.conf中的sed/awk处理?还是更好地利用一个小的settings.conf-读取Python脚本本身。


0
在 Django 3.1.1 中,如果您想要完全重置数据库和模式,请将以下代码放入任何应用程序中:

app/management/commands/resetdb.py

import os
import glob
import shutil
from django.conf import settings
from django.core.management.base import BaseCommand
from django.db import connection


class Command(BaseCommand):
    help = 'Resets the database'

    def handle(self, *args, **options):
        dbname = settings.DATABASES["default"]["NAME"]
        with connection.cursor() as cursor:
            cursor.execute("DROP DATABASE %s" % dbname)
            cursor.execute("CREATE DATABASE %s" % dbname)

        base = str(settings.BASE_DIR)
        migrations = glob.glob(os.path.join(base, "*", "migrations"))

        for migration in migrations:
            shutil.rmtree(migration)

        apps = [migration.split("\\")[-2] for migration in migrations]
        for app in apps:
            os.system("python manage.py makemigrations %s" % app)
        os.system("python manage.py migrate")

现在使用以下方式进行重置:

python manage.py resetdb

这将会

  • 删除数据库
  • 删除迁移文件夹
  • 生成新的迁移文件
  • 创建新的数据库
  • 迁移新的数据表

-2

看一下 Django 代码中的重置命令,然后编写自己的命令,首先删除/创建数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接