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 sqlclear
interessant. Documentatie zegt dat ./manage.py sqlclear
De 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 sqlclear
als reset
vereisen een app-naam.
U kunt echter Django-extensiesinstalleren waarmee u manage.py reset_db
krijgt , 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 zero
gebruiken.
Anders zou ik de opdracht ./manage.py dbshell
aanbevelen, waarbij SQL-opdrachten worden doorgelinkt op standaardinvoer.
Antwoord 4, autoriteit 24%
python manage.py migrate <app> zero
sqlclear
is 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 dbshell
omdat 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_command
drukt de SQL af naar stdout in plaats van retourneer het als een string, en ik kan de sql_delete
code 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 sqlclear
of ./manage.py sqlflush
lijkt 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_db
opdracht. 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