6

Djangoアプリでデータベース内のすべてのデータを削除するにはどうすればよいですか? 以前のバージョンmanage.py reset APPNAMEでは仕事をしていましたが、それは廃止されました。

コマンドラインを使用してアプリからすべてのデータを削除したい場合、今何をすべきでしょうか?

4

5 に答える 5

15

resetsqlresetどちらも他の管理コマンドの単なるラッパーでした。sqlreset特に、次を実行するだけで複製できます。

python manage.py sqlclear myapp
python manage.py sqlall myapp

resetデータベースでの結果を自動的に実行するためにのみ提供されsqlresetます。個人的には、それを取り除くことは素晴らしいアイデアだと思います。それでも、同様の機能が必要な場合は、出力をデータベースのシェル コマンドにパイプするだけです。

たとえば、PostgreSQL の場合:

python manage.py sqlclear myapp | psql mydatabase
python manage.py sqlall myapp | psql mydatabase
于 2012-06-29T18:57:38.583 に答える
8

ほとんどのデータベース タイプで動作する単一のコマンドが必要な場合は、sqlclear が生成する drop table ステートメントを dbshel​​l にパイプできます。

python manage.py sqlclear myapp | python manage.py dbshell

于 2014-02-05T23:41:29.880 に答える
5
from django.contrib.contenttypes.models import ContentType
for ct in ContentType.objects.all()
    ct.model_class().objects.all().delete()
于 2012-06-29T17:57:18.653 に答える
2

Django はデフォルトでマイグレーションを統合するようになったので、最初にアプリのマイグレーションを適用解除してから削除する必要があります。

少なくともDjango 1.8で動作するコマンド ラインを次に示します (すべての関連データを削除するアプリケーションに置き換えて、次のようにします。

# First, update the DB so it thinks no migrations were applied to the app
python manage.py migrate --fake <app_name> zero

# Erase all migrations in the app folder
rm -r "<app_name>/migrations/*"

# Erase the application tables
python manage.py sqlclear <app_name> | python manage.py dbshell

# Recreate the app tables, that will be empty
python manage.py makemigrations <app_name>
python manage.py migrate <app_name>
于 2015-08-12T11:54:46.810 に答える
0

自作

コマンド ラインから実行する場合は、次のカスタム コマンドを作成します。

from django.core.management.base import AppCommand, CommandError
from django.utils.six.moves import input
from django.db import DEFAULT_DB_ALIAS, connections

class Command(AppCommand):
    help = (
        'Removes ALL DATA related to the given app from the database '
        'by calling model.objects.all().delete() for all app models. '
        'This also removes related data in other apps via cascade.'
    )

    def add_arguments(self, parser):
        super(Command, self).add_arguments(parser)
        parser.add_argument(
            '--noinput', '--no-input',
            action='store_false', dest='interactive', default=True,
            help='Tells Django to NOT prompt the user for input of any kind.',
        )
        parser.add_argument(
            '--database', action='store', dest='database', default=DEFAULT_DB_ALIAS,
            help='Nominates a database to reset. Defaults to the "default" database.',
        )

    def handle_app_config(self, app_config, **options):
        app_label = app_config.label
        database = options['database']
        interactive = options['interactive']
        db_name = connections[database].settings_dict['NAME']

        confirm = (ask_confirmation(app_label, db_name)
                if interactive else 'yes')

        if confirm == 'yes':
            for model in app_config.get_models():
                model.objects.using(database).all().delete()
            self.stdout.write('Reset done.\n')
        else:
            self.stdout.write("Reset cancelled.\n")

def ask_confirmation(app_label, db_name):
    return input("""You have requested a reset of the application {app_label}.
This will IRREVERSIBLY DESTROY all data related to the app currently in
the {db_name} database, and return each table to empty state.
Are you sure you want to do this?
    Type 'yes' to continue, or 'no' to cancel: """.format(**locals()))

app/management/commandsアプリフォルダーのいずれかのフォルダーにコピーし、で実行します

./manage.py app_db_tables_reset any_installed_app_name

既製パッケージ

コマンドはdjango_commands パッケージで利用可能で、次のコマンドでインストールできます

pip install git+http://github.com/mrts/django-commands.git

に追加してINSTALLED_APPS、コマンドをアクティブにします。

Django 1.9 でテスト済みですが、1.8 では動作する場合と動作しない場合があります。

于 2016-06-25T12:29:14.770 に答える