完全重置Django数据库

20 投票
7 回答
24933 浏览
提问于 2025-04-15 19:26

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

manage.py flush做得太少了(如果有结构变化就不管用了),而manage.py reset则需要我指定所有的应用程序(而且它的格式似乎和简单的" ".join(INSTALLED_APPS)不一样)。我当然可以用数据库特定的方法来实现这个,但我想应该有一种通用的方法,不依赖于具体的数据库。

[编辑:我想要一个可以从脚本中调用的东西,比如一个Makefile,并且如果我更换数据库后端或者添加到settings.INSTALLED_APPS中,它仍然能继续工作]

7 个回答

0

嗯,也许你是在对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文件呢。

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 不会自动为你执行这个操作。它只会给你输出一些命令,你需要手动复制粘贴。

21

这个代码片段提供了一个可以安装的 manage.py reset_db 命令的代码,这个修改是解决你问题的最简单方法。


另外,根据下面的评论:

你也可以直接安装 Django 命令扩展,这样就能得到 reset_db 以及其他一些好用的功能: https://github.com/django-extensions/django-extensions

撰写回答