Hoe verwijder je alle tabellen uit de database met manage.py CLI in Django?

Hoe kan ik alle tabellen uit een database verwijderen met behulp van manage.py en de opdrachtregel? Is er een manier om dat te doen door manage.py uit te voeren met de juiste parameters, zodat ik het vanuit een .NET-toepassing kan uitvoeren?


Antwoord 1, autoriteit 100%

Voor zover ik weet is er geen beheeropdracht om alle tabellen te verwijderen. Als je het niet erg vindt om Python te hacken, kun je je eigen aangepaste opdracht schrijven om dat te doen. Mogelijk vindt u de optie sqlclearinteressant. Documentatie zegt dat ./manage.py sqlclearDe DROP TABLE SQL-instructies voor de opgegeven app-naam(en) afdrukt.

Bijwerken:
Zich schaamteloos de opmerking van @Mike DeSimone‘s opmerking onder dit antwoord toe-eigenen om een ​​volledig antwoord te geven.

./manage.py sqlclear | ./manage.py dbshell

Vanaf django 1.9 is het nu ./manage.py sqlflush


Antwoord 2, autoriteit 35%

Er is geen native Django-beheeropdracht om alle tabellen te verwijderen. Zowel sqlclearals resetvereisen een app-naam.

U kunt echter Django-extensiesinstalleren waarmee u manage.py reset_dbkrijgt , die precies doet wat u wilt (en u toegang geeft tot veel meerhandige beheeropdrachten).


Antwoord 3, autoriteit 25%

Als u het South-pakket gebruikt om databasemigraties af te handelen (sterk aanbevolen), kunt u gewoon de opdracht ./manage.py migrate appname zerogebruiken.

Anders zou ik de opdracht ./manage.py dbshellaanbevelen, waarbij SQL-opdrachten worden doorgelinkt op standaardinvoer.


Antwoord 4, autoriteit 24%

python manage.py migrate <app> zero

sqlclearis verwijderd uit 1.9.

Release-opmerkingen vermelden dat dit te wijten is aan de introductie van migraties: https:// docs.djangoproject.com/en/1.9/releases/1.9/

Helaas kon ik geen methode vinden die op alle apps tegelijk werkt, noch een ingebouwde manier om alle geïnstalleerde apps van de beheerder weer te geven: Hoe kan ik alle geïnstalleerde apps weergeven met manage.py in Django?

Gerelateerd: Hoe migraties resetten in Django 1.7?


Antwoord 5, autoriteit 10%

Het is beter om ./manage.py sqlflush | ./manage.py dbshellomdat sqlclear vereist dat de app wordt leeggemaakt.


Antwoord 6, autoriteit 6%

eenvoudige(?) manier om het te doen vanuit python (op mysql):

from django.db import connection
cursor = connection.cursor()
cursor.execute('show tables;')
parts = ('DROP TABLE IF EXISTS %s;' % table for (table,) in cursor.fetchall())
sql = 'SET FOREIGN_KEY_CHECKS = 0;\n' + '\n'.join(parts) + 'SET FOREIGN_KEY_CHECKS = 1;\n'
connection.cursor().execute(sql)

Antwoord 7, autoriteit 4%

Hier is een shellscript dat ik uiteindelijk heb samengesteld om dit probleem op te lossen. Ik hoop dat het iemand wat tijd bespaart.

#!/bin/sh
drop() {
    echo "Droping all tables prefixed with $1_."
    echo
    echo "show tables" | ./manage.py dbshell |
    egrep "^$1_" | xargs -I "@@" echo "DROP TABLE @@;" |
    ./manage.py dbshell
    echo "Tables dropped."
    echo
}
cancel() {
    echo "Cancelling Table Drop."
    echo
}
if [ -z "$1" ]; then
    echo "Please specify a table prefix to drop."
else
    echo "Drop all tables with $1_ prefix?"
    select choice in drop cancel;do
        $choice $1
        break
    done
fi

Antwoord 8, autoriteit 4%

Als je de database volledig wilt wissen en tegelijkertijd opnieuw wilt synchroniseren, heb je zoiets als het volgende nodig. Ik combineer ook het toevoegen van testgegevens in deze opdracht:

#!/usr/bin/env python
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main.settings") # Replace with your app name.
from django.db import connection
from django.core.management import call_command
from django.conf import settings
# If you're using postgres you can't use django's sql stuff for some reason that I
# can't remember. It has to do with that autocommit thing I think.
# import psychodb2 as db
def recreateDb():
    print("Wiping database")
    dbinfo = settings.DATABASES['default']
    # Postgres version
    #conn = db.connect(host=dbinfo['HOST'], user=dbinfo['USER'],
    #                 password=dbinfo['PASSWORD'], port=int(dbinfo['PORT'] or 5432))
    #conn.autocommit = True
    #cursor = conn.cursor()
    #cursor.execute("DROP DATABASE " + dbinfo['NAME'])
    #cursor.execute("CREATE DATABASE " + dbinfo['NAME'] + " WITH ENCODING 'UTF8'") # Default is UTF8, but can be changed so lets be sure.
    # Mysql version:
    print("Dropping and creating database " + dbinfo['NAME'])
    cursor = connection.cursor()
    cursor.execute("DROP DATABASE " + dbinfo["NAME"] + "; CREATE DATABASE " + dbinfo["NAME"] + "; USE " + dbinfo["NAME"] + ";")
    print("Done")
if __name__ == "__main__":
    recreateDb();
    print("Syncing DB")
    call_command('syncdb', interactive=False)
    print("Adding test data")
    addTestData() # ...

Het zou leuk zijn om cursor.execute(call_command('sqlclear', 'main'))te kunnen doen, maar call_commanddrukt de SQL af naar stdout in plaats van retourneer het als een string, en ik kan de sql_deletecode niet achterhalen…


Antwoord 9, autoriteit 2%

Als u psql gebruikt en django-more 2.0.0 hebt geïnstalleerd, kunt u dit doen

manage.py reset_schema


Antwoord 10

De opdracht ./manage.py sqlclearof ./manage.py sqlflushlijkt de tabel leeg te maken en niet te verwijderen, maar als u de volledige database probeer dit: manage.py flush.

Waarschuwing:hiermee wordt uw database volledig verwijderd en verliest u al uw gegevens, dus als dat niet belangrijk is, kunt u het proberen.


Antwoord 11

Dit antwoord is voor postgresql DB:

Uitvoeren:
echo ‘drop eigendom van some_user‘ | ./manage.py dbshell

OPMERKING: some_useris de naam van de gebruiker die u gebruikt om toegang te krijgen tot de database, zie het bestand settings.py:

default_database = {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'somedbname',
    'USER': 'some_user',
    'PASSWORD': 'somepass',
    'HOST': 'postgresql',
    'PORT': '',
}

Antwoord 12

Als je Python gebruikt om een ​​flushproject-commando te maken, gebruik je :

from django.db import connection
cursor = connection.cursor()
cursor.execute(“DROP DATABASE %s;”, [connection.settings_dict['NAME']])
cursor.execute(“CREATE DATABASE %s;”, [connection.settings_dict['NAME']])

Antwoord 13

Hier is een voorbeeld van Makefile om leuke dingen te doen met meerdere instellingenbestanden:

test:
    python manage.py test --settings=my_project.test
db_drop:
    echo 'DROP DATABASE my_project_development;' | ./manage.py dbshell
    echo 'DROP DATABASE my_project_test;' | ./manage.py dbshell
db_create:
    echo 'CREATE DATABASE my_project_development;' | ./manage.py dbshell
    echo 'CREATE DATABASE my_project_test;' | ./manage.py dbshell
db_migrate:
    python manage.py migrate --settings=my_project.base
    python manage.py migrate --settings=my_project.test
db_reset: db_drop db_create db_migrate
.PHONY: test db_drop db_create db_migrate db_reset

Dan kun je dingen doen als:

$ make db_reset


Antwoord 14

Ik zou u aanraden django-extensions en gebruik python manage.py reset_dbopdracht. Het doet precies wat je wilt.


15

Er is een nog eenvoudiger antwoord als u al uw tabellen wilt verwijderen. U gaat gewoon naar uw map die de database bevat (die MyDatabase.db kan worden genoemd) en klik met de rechtermuisknop op het .dB-bestand en druk op “Delete”. Ouderwetse manier, zeker-vuur om te werken.


Antwoord 16

gebruik de opdracht “python manage.py sqlflush” in Windows 10
typ voor anderen manage.py

Other episodes