如何完全重置我的Django(1.2 alpha)数据库(删除所有表,而不是仅仅清除它们)?
manage.py flush
做得太少(如果有架构更改则无效)manage.py reset
要求我指定所有应用(并且看起来采用的格式不同于“”.join (INSTALLED_APPS))。我显然可以用DB特定的方式实现这一点,但我认为必须有一个理智的,DB后端不可知的方式来做到这一点。
[编辑:我正在寻找可以通过脚本调用的内容,例如:一个Makefile,如果我更改后端数据库或添加到settings.INSTALLED_APPS
]
答案 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环境中以及:
将当前文件夹更改为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命令,并编写自己的首先删除/创建数据库。