完成django DB重置

时间:2010-02-18 14:16:17

标签: python django

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

manage.py flush做得太少(如果有架构更改则无效)manage.py reset要求我指定所有应用(并且看起来采用的格式不同于“”.join (INSTALLED_APPS))。我显然可以用DB特定的方式实现这一点,但我认为必须有一个理智的,DB后端不可知的方式来做到这一点。

[编辑:我正在寻找可以通过脚本调用的内容,例如:一个Makefile,如果我更改后端数据库或添加到settings.INSTALLED_APPS]

,它将继续有效

7 个答案:

答案 0 :(得分:17)

This Snippet为您提供了可以安装的manage.py reset_db命令的代码,这是解决问题的最小更改


那说,来自下面的评论:

  

您也可以安装Django命令扩展来获取   reset_db和其他好东西:   https://github.com/django-extensions/django-extensions

答案 1 :(得分: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不会自动为您执行此操作。它只会输出您复制和粘贴的命令。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

嗯,也许你骗到manage.py,假装制作灯具,但只是为了寻找应用:

  

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

打印出项目所有apps表的DROP TABLE语句列表,不包括django表本身。如果要包含它们,请删除|^django模式vom egrep。

但是如何提供正确的数据库后端? sed / awk-ing通过settings.conf?或者更好地利用一些settings.conf-reading python脚本本身。

答案 4 :(得分:0)

假设你(幸运的话)在Linux环境中以及:

  • 使用MySQL并知道用户/密码来访问项目的数据库
  • bash,mysql,readlink已安装
  • settings.py是settings.py
  • dbname与您的django项目名称相同(请参阅下面的 MYAPP var)
  • 您要重置的所有APPS都在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 oneliner的内容 - 基于这个想法(例如把它放到Makefile中)应该不是问题。

答案 5 :(得分: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

这将

  • 删除数据库
  • 删除迁移文件夹
  • 进行迁移
  • 创建一个新的数据库
  • 迁移新表

答案 6 :(得分:-1)

在django的代码中查看reset命令,并编写自己的首先删除/创建数据库。