जवाबों:
जहां तक मुझे पता है कि सभी तालिकाओं को छोड़ने के लिए कोई प्रबंधन आदेश नहीं है। यदि आप अजगर को हैक करने से गुरेज नहीं करते हैं, तो आप ऐसा करने के लिए अपनी खुद की कस्टम कमांड लिख सकते हैं। आपको sqlclear
विकल्प दिलचस्प लग सकता है । डॉक्यूमेंटेशन कहता है कि ./manage.py sqlclear
दिए गए ऐप के नाम के लिए DROP TABLE SQL स्टेटमेंट प्रिंट करता है।
अद्यतन : पूरी तरह से जवाब देने के लिए इस उत्तर के नीचे @Mike DeSimone की टिप्पणी का बेशर्मी से विनियोजन करना ।
./manage.py sqlclear | ./manage.py dbshell
Django 1.9 के रूप में यह अब है ./manage.py sqlflush
./manage.py sqlclear myAppName | ./manage.py dbshell
सभी टेबल को छोड़ने के लिए कोई देशी Django प्रबंधन आदेश नहीं है। दोनों sqlclear
और reset
एक ऐप नाम की आवश्यकता है।
हालाँकि, आप Django एक्सटेंशन को स्थापित कर सकते हैं जो आपको देता है manage.py reset_db
, जो वास्तव में आप चाहते हैं (और आपको कई और उपयोगी प्रबंधन कमांड तक पहुंच प्रदान करता है )।
manage.py reset_db
डेटाबेस को छोड़ने से पहले डेटाबेस कनेक्शन बंद करने के लिए फ्लैग `-c, -close-session` की आवश्यकता होती है (केवल PostgreSQL)
यदि आप डेटाबेस माइग्रेशन (अत्यधिक अनुशंसित) को संभालने के लिए दक्षिण पैकेज का उपयोग कर रहे हैं, तो आप बस ./manage.py migrate appname zero
कमांड का उपयोग कर सकते हैं ।
अन्यथा, मैं ./manage.py dbshell
कमांड का सुझाव देता हूं , मानक इनपुट पर SQL कमांड में पाइपिंग।
python manage.py migrate <app> zero
sqlclear
1.9 से हटा दिया गया था।
जारी नोटों में उल्लेख है कि यह माइग्रेशन की शुरुआत के कारण है: https://docs.djangoproject.com/en/1.9/releases/1.9/
दुर्भाग्य से मुझे एक ऐसा तरीका नहीं मिला जो एक ही बार में सभी ऐप पर काम करता हो, न ही किसी तरह से एडमिन से सभी इंस्टॉल किए गए ऐप्स को लिस्ट करने का तरीका: Django में मैनेज करने वाले सभी इंस्टॉल किए गए ऐप्स को कैसे लिस्ट करें?
अजगर से करने के लिए सरल (?) तरीका (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)
यदि आप डेटाबेस को पूरी तरह से मिटा देना चाहते हैं और इसे उसी तरह से फिर से बनाना चाहते हैं, तो आपको निम्नलिखित की तरह कुछ चाहिए। मैं इस कमांड में टेस्ट डेटा जोड़ रहा हूँ:
#!/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() # ...
यह करने में सक्षम होना अच्छा होगा cursor.execute(call_command('sqlclear', 'main'))
लेकिन call_command
एसक्यूएल को स्ट्रिंग के रूप में वापस करने के बजाय स्टडआउट करने के लिए प्रिंट करता है, और मैं sql_delete
कोड को काम नहीं कर सकता ...
USE DATABASE
मुझे अच्छा लगा कि आप एक प्रबंधन कमांड के साथ एक django-recreate-db पैकेज बनाने की सलाह देते हैं जो SQLite3 et PostGresql के बीच स्विच करने के लिए सेटिंग्स के आधार पर ऑटो स्विच करेगा।
यहाँ एक शेल स्क्रिप्ट है जिसे मैंने इस मुद्दे से निपटने के लिए एक साथ समाप्त कर दिया है। आशा है कि यह किसी को कुछ समय बचाता है।
#!/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
एक फ्लशप्रोजेक्ट कमांड बनाने के लिए अजगर का उपयोग करना, आप उपयोग करते हैं:
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']])
flushdb
और उसके बाद मैंने एक और कमांड लॉन्च किया। यदि आपको किसी अन्य स्क्रिप्ट में इसकी आवश्यकता है, तो आप उपयोग कर सकते हैंcall_command
call_command
। आप कह रहे हैं कि मुझे call_command("flushdb")
पहले करना चाहिए call_command("syncdb")
?
आदेश ./manage.py sqlclear
या ./manage.py sqlflush
तालिका को खाली करने और उन्हें हटाने के लिए नहीं लगता है, हालांकि यदि आप पूरा डेटाबेस हटाना चाहते हैं तो यह प्रयास करें manage.py flush
:।
चेतावनी: यह आपके डेटाबेस को पूरी तरह से हटा देगा और आप अपना सारा डेटा खो देंगे, इसलिए यदि महत्वपूर्ण नहीं है तो आगे बढ़ें और इसे आज़माएँ।
यहाँ कई सेटिंग्स फ़ाइलों के साथ कुछ अच्छा काम करने के लिए एक उदाहरण Makefile है:
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
तब आप निम्न कार्य कर सकते हैं:
$ make db_reset
यह उत्तर पोस्टग्रैक्स्ल डीबी के लिए है:
चलाएँ: गूंज 'के स्वामित्व में ड्रॉप some_user ' | ./manage.py dbshell
नोट: some_user उस उपयोगकर्ता का नाम है जिसे आप डेटाबेस तक पहुंचने के लिए उपयोग करते हैं, सेटिंग्सहोम फ़ाइल देखें:
default_database = {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'somedbname',
'USER': 'some_user',
'PASSWORD': 'somepass',
'HOST': 'postgresql',
'PORT': '',
}
यदि आप psql का उपयोग कर रहे हैं और django-more 2.0.0 स्थापित है, तो आप कर सकते हैं
manage.py reset_schema
यहाँ @ पीटर-जी के उत्तर का दक्षिण प्रवास संस्करण है। मैं अक्सर कच्चे sql के साथ फिड करता हूं, इसलिए यह किसी भी befuddled ऐप्स के लिए 0001_initial.py के रूप में काम आता है। यह केवल DBs पर काम करेगा जो समर्थन करता है SHOW TABLES
(जैसे mysql)। SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
यदि आप PostgreSQL का उपयोग करते हैं , तो कुछ ऐसा रखें । इसके अलावा, मैं अक्सर माइग्रेशन forwards
और backwards
माइग्रेशन दोनों के लिए यही काम करता हूं ।
from south.db import db
from south.v2 import SchemaMigration
from django.db.utils import DatabaseError
from os import path
from logging import getLogger
logger = getLogger(__name__)
class Migration(SchemaMigration):
def forwards(self, orm):
app_name = path.basename(path.split(path.split(path.abspath(__file__))[0])[0])
table_tuples = db.execute(r"SHOW TABLES;")
for tt in table_tuples:
table = tt[0]
if not table.startswith(app_name + '_'):
continue
try:
logger.warn('Deleting db table %s ...' % table)
db.delete_table(table)
except DatabaseError:
from traceback import format_exc
logger.error("Error running %s: \n %s" % (repr(self.forwards), format_exc()))
सहकर्मी / सहकर्मी मुझे मार डालते अगर उन्हें पता होता कि मैंने यह किया है, हालाँकि।
यदि आप अपनी सभी तालिकाओं को हटाना चाहते हैं तो और भी सरल उत्तर है। आप बस अपने फ़ोल्डर में जाते हैं जिसमें डेटाबेस होता है (जिसे mydatabase.db कहा जा सकता है) और .db फ़ाइल पर राइट-क्लिक करें और "डिलीट" करें। पुराने ढंग से, काम करने के लिए निश्चित रूप से आग।
सभी तालिकाओं को गिराता है और उन्हें पुनः बनाता है:
python manage.py sqlclear app1 app2 appN | sed -n "2,$p" | sed -n "$ !p" | sed "s/";/" CASCADE;/" | sed -e "1s/^/BEGIN;/" -e "$s/$/COMMIT;/" | python manage.py dbshell
python manage.py syncdb
स्पष्टीकरण:
manage.py sqlclear
- "दिए गए ऐप के नाम के लिए DROP TABLE SQL स्टेटमेंट प्रिंट करता है"
sed -n "2,$p"
- पहली लाइन को छोड़कर सभी लाइनों को पकड़ लेता है
sed -n "$ !p"
- अंतिम लाइन को छोड़कर सभी लाइनों को पकड़ लेता है
sed "s/";/" CASCADE;/"
(CASCADE;) के साथ सभी अर्धविराम (?) को प्रतिस्थापित करता है;
sed -e "1s/^/BEGIN;/" -e "$s/$/COMMIT;/"
- आवेषण (BEGIN;) पहले पाठ के रूप में, अंतिम पाठ के रूप में आवेषण (COMMIT;)
manage.py dbshell
- "आपके USER, PASSWORD, आदि, सेटिंग्स में निर्दिष्ट कनेक्शन मापदंडों के साथ, आपके इंजन सेटिंग में निर्दिष्ट डेटाबेस इंजन के लिए कमांड-लाइन क्लाइंट चलाता है"
manage.py syncdb
- "INSTALLED_APPS में उन सभी ऐप्स के लिए डेटाबेस टेबल बनाता है जिनकी टेबल पहले से नहीं बनी है"
निर्भरता:
क्रेडिट:
@ मेन्ज गोविंदन और @ मायके डेमिसोन फॉर स्क्क्कलियर पाइप्ड टू डबशेल
@ sed "s" / "के लिए; /" CASCADE; / "
विंडोज़ 10 में "python manage.py sqlflush" कमांड का उपयोग दूसरों के लिए manage.py टाइप करें
मैं आपको django- एक्सटेंशन इंस्टॉल करने और python manage.py reset_db
कमांड का उपयोग करने की सलाह दूंगा । यह वही करता है जो आप चाहते हैं।