完全重置Django数据库
我该如何完全重置我的Django(1.2 alpha)数据库(也就是删除所有表,而不仅仅是清空它们)?
manage.py flush
做得太少了(如果有结构变化就不管用了),而manage.py reset
则需要我指定所有的应用程序(而且它的格式似乎和简单的" ".join(INSTALLED_APPS)不一样)。我当然可以用数据库特定的方法来实现这个,但我想应该有一种通用的方法,不依赖于具体的数据库。
[编辑:我想要一个可以从脚本中调用的东西,比如一个Makefile,并且如果我更换数据库后端或者添加到settings.INSTALLED_APPS
中,它仍然能继续工作]
7 个回答
嗯,也许你是在对manage.py撒谎,假装在创建数据,但其实只是想找出所有的应用:
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自己的表。如果你想把django的表也包括进去,只需要去掉|^django
这个部分。
不过,如何提供正确的数据库后端呢?是通过sed/awk来处理settings.conf文件吗?还是更好地用一个小的Python脚本来读取settings.conf文件呢。
你想要用到 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_db
命令的代码,这个修改是解决你问题的最简单方法。
另外,根据下面的评论:
你也可以直接安装 Django 命令扩展,这样就能得到 reset_db 以及其他一些好用的功能: https://github.com/django-extensions/django-extensions