Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 完成django数据库重置_Python_Django - Fatal编程技术网

Python 完成django数据库重置

Python 完成django数据库重置,python,django,Python,Django,如何完全重置Django(1.2 alpha)DB(删除所有表,而不仅仅是清除它们) manage.py flush执行的操作太少(如果架构发生更改,则不起作用),并且manage.py reset要求我指定所有应用程序(并且似乎采用的格式与“”不同。加入(已安装的应用程序))。显然,我可以通过特定于数据库的方式来实现这一点,但我认为必须有一种理智的、与数据库后端无关的方式来实现这一点 [编辑:我正在寻找可以从脚本调用的东西,例如Makefile,如果我更改后端数据库或添加到设置,它将继续工作。

如何完全重置Django(1.2 alpha)DB(删除所有表,而不仅仅是清除它们)

manage.py flush
执行的操作太少(如果架构发生更改,则不起作用),并且
manage.py reset
要求我指定所有应用程序(并且似乎采用的格式与“”不同。加入(已安装的应用程序))。显然,我可以通过特定于数据库的方式来实现这一点,但我认为必须有一种理智的、与数据库后端无关的方式来实现这一点


[编辑:我正在寻找可以从脚本调用的东西,例如Makefile,如果我更改后端数据库或添加到
设置,它将继续工作。已安装的应用程序
]

您想要
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
%python manage.py帮助sqlreset
用法:manage.py sqlreset[选项]
打印给定应用程序名称的删除表SQL,然后是创建表SQL。
选项:
-v冗长,--VERBOSITY=冗长
冗长程度;0=最小输出,1=正常输出,
2=所有输出
--设置=设置设置模块的Python路径,例如。
“myproject.settings.main”。如果未提供,则
DJANGO_设置_模块环境变量将为
用过。
--pythonpath=pythonpath
要添加到Python路径的目录,例如。
“/home/djangoprojects/myproject”。
--回溯打印异常时的回溯
--版本显示程序的版本号并退出
-h、 --帮助显示此帮助消息并退出

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

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

看看django代码中的reset命令,然后编写您自己的命令,先删除/创建DB。

Hm,也许您对manage.py撒谎,假装制作夹具,但只是为了寻找应用程序:

apps=$(python manage.py makefixture 2>&1 | egrep-v'(^Error | ^django)| awk-F.{print$2}'| uniq);对于i,在$apps中;do python manage.py sqlreset$i;完成| grep DROP

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

但是如何为正确的数据库后端提供数据呢?sed/awk通过settings.conf进行加密?或者最好利用一点settings.conf-reading python脚本本身。

为您提供可以安装的
manage.py reset\u db
命令的代码,这是解决问题的最小更改


尽管如此,从以下评论中可以看出:


您最好只安装Django命令扩展来获得 重置_db和其他物品:

假设您(幸运地)处于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 oneliner中的内容,那么在这个想法的基础上进行构建应该不会有问题(例如,将其放入Makefile)

在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
这将

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

manage.py reset
我上面提到的只是
sqlreset
的一个包装,所以同样的问题也适用:我不想手动列出所有应用程序名。如果我在
settings.py
中添加到
INSTALLED\u APPS
,我想要一个能够自动运行并继续工作的解决方案。然后,您必须运行自己的脚本。我认为这个功能不存在。对不起,我应该说明我需要一些可以自动执行的功能。@as:数据库删除怎么不能自动执行?你的数据库是什么?编写一个SQL脚本到
DROP DATABASE x并运行它。您还可以安装Django命令扩展来获得reset_db和其他好处:太好了——这正是我需要的!只需:
pip install django extensions
然后
python manage.py reset_db
完成@abstraktor注释:在键入
python manage.py reset_db
之前,您需要在项目中启用django_扩展,您需要将其添加到项目设置中已安装的_应用中。py文件:
INSTALLED_APPS=(…'django_extensions',…)
django命令扩展可能是实现这一点的最理想方法。请注意,S.Lott建议的echo'DROP DATABASE dbx;'| mysql dbx也适用于unix命令行。然后您只需调用syncdb即可