Django में डेटाबेस से मैनेज के साथ सभी टेबल कैसे छोड़ें?


92

मैं प्रबंधन डेटाबेस और कमांड लाइन का उपयोग करके डेटाबेस से सभी तालिकाओं को कैसे गिरा सकता हूं? क्या ऐसा कोई तरीका है कि मैं उचित मापदंडों के साथ प्रबंधको को क्रियान्वित करूं ताकि मैं इसे .NET एप्लिकेशन से निष्पादित कर सकूं?

जवाबों:


127

जहां तक ​​मुझे पता है कि सभी तालिकाओं को छोड़ने के लिए कोई प्रबंधन आदेश नहीं है। यदि आप अजगर को हैक करने से गुरेज नहीं करते हैं, तो आप ऐसा करने के लिए अपनी खुद की कस्टम कमांड लिख सकते हैं। आपको sqlclearविकल्प दिलचस्प लग सकता है । डॉक्यूमेंटेशन कहता है कि ./manage.py sqlclear दिए गए ऐप के नाम के लिए DROP TABLE SQL स्टेटमेंट प्रिंट करता है।

अद्यतन : पूरी तरह से जवाब देने के लिए इस उत्तर के नीचे @Mike DeSimone की टिप्पणी का बेशर्मी से विनियोजन करना

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

Django 1.9 के रूप में यह अब है ./manage.py sqlflush


sqlclear "ड्रॉप स्टेटमेंट्स को प्रिंट करता है" लेकिन एकल कमांड लाइन कॉल में उन्हें कैसे निष्पादित किया जाए
kmalmur

3
आपको ऐप नाम की आवश्यकता है:./manage.py sqlclear myAppName | ./manage.py dbshell
मोंटारो

4
यह बिल्कुल काम नहीं करता है। sqlclear को एक ऐप नाम की आवश्यकता है। मैं Django 1.8 पर हूँ
जोनाथन हार्टले

बस इस बात का ध्यान रखें कि sqlflush तालिकाओं को नहीं गिराता है, यह उन्हें काट देता है। जब तक आप sqlflush द्वारा उत्पन्न ट्रंकट कमांड के अंत में CASCADE कीवर्ड नहीं जोड़ते हैं, तब तक यह ऑपरेशन संभवत: आपके postgresql DB पर काम नहीं करेगा।
user3748764

35

सभी टेबल को छोड़ने के लिए कोई देशी Django प्रबंधन आदेश नहीं है। दोनों sqlclearऔर resetएक ऐप नाम की आवश्यकता है।

हालाँकि, आप Django एक्सटेंशन को स्थापित कर सकते हैं जो आपको देता है manage.py reset_db, जो वास्तव में आप चाहते हैं (और आपको कई और उपयोगी प्रबंधन कमांड तक पहुंच प्रदान करता है )।


@JulienGreard अपडेट किया गया। धन्यवाद!
अनुज गुप्ता

3
मैंने कोशिश करना छोड़ दिया और इसका इस्तेमाल किया।
laffuste

इसने मेरे लिए काम किया, जबकि उच्च रैंक वाले उत्तर में से किसी ने भी नहीं किया।
जोनाथन हार्टले

@AnujGupta को भी अक्सर manage.py reset_dbडेटाबेस को छोड़ने से पहले डेटाबेस कनेक्शन बंद करने के लिए फ्लैग `-c, -close-session` की आवश्यकता होती है (केवल PostgreSQL)
Valery Ramusik

34

यदि आप डेटाबेस माइग्रेशन (अत्यधिक अनुशंसित) को संभालने के लिए दक्षिण पैकेज का उपयोग कर रहे हैं, तो आप बस ./manage.py migrate appname zeroकमांड का उपयोग कर सकते हैं ।

अन्यथा, मैं ./manage.py dbshellकमांड का सुझाव देता हूं , मानक इनपुट पर SQL कमांड में पाइपिंग।


+1। किसी भी गैर-तुच्छ Django परियोजना को दक्षिण का उपयोग करना चाहिए। और एक बार जब आप दक्षिण का उपयोग करते हैं तो शून्य पर पलायन सभी तालिकाओं को छोड़ने का एक अच्छा मुहावरेदार तरीका है।
मनोज गोविंदन

यहां तक ​​कि तुच्छ Django परियोजनाओं को दक्षिण पर विचार करना चाहिए। बस लोगों को डेटाबेस से पलायन करने के लिए इस्तेमाल किया जाता है, और इसलिए वे बुरी आदतों को नहीं सीखते हैं जैसे कि डेटा को डंप करना, हैक करना और डेटा को फिर से लोड करना, या डेटा को माइग्रेट करने के लिए जुड़नार तंत्र का उपयोग करना।
माइक डेनिमोन

मैं दक्षिण का उपयोग करता हूं, लेकिन मैं हर प्रवास के लिए रिवर्स माइग्रेशन लिखने से परेशान नहीं हूं: कम से कम डेटा माइग्रेशन नहीं। और मैं ऐसा नहीं करूंगा ताकि मैं शून्य विकल्प का उपयोग कर सकूं। निश्चित रूप से परीक्षण का एक अच्छा तरीका है कि आप शून्य पर वापस / उल्टा कर सकते हैं, यदि यह आपके लिए महत्वपूर्ण है। सभी तालिकाओं को गिरा देना मुझे उचित लगता है।
टोबेक

26

python manage.py migrate <app> zero

sqlclear 1.9 से हटा दिया गया था।

जारी नोटों में उल्लेख है कि यह माइग्रेशन की शुरुआत के कारण है: https://docs.djangoproject.com/en/1.9/releases/1.9/

दुर्भाग्य से मुझे एक ऐसा तरीका नहीं मिला जो एक ही बार में सभी ऐप पर काम करता हो, न ही किसी तरह से एडमिन से सभी इंस्टॉल किए गए ऐप्स को लिस्ट करने का तरीका: Django में मैनेज करने वाले सभी इंस्टॉल किए गए ऐप्स को कैसे लिस्ट करें?

संबंधित: Django 1.7 में माइग्रेशन कैसे रीसेट करें?


12

यह उपयोग करने के लिए बेहतर है ./manage.py sqlflush | ./manage.py dbshellक्योंकि sqlclear को फ्लश करने के लिए ऐप की आवश्यकता होती है।


7

अजगर से करने के लिए सरल (?) तरीका (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)

5

यदि आप डेटाबेस को पूरी तरह से मिटा देना चाहते हैं और इसे उसी तरह से फिर से बनाना चाहते हैं, तो आपको निम्नलिखित की तरह कुछ चाहिए। मैं इस कमांड में टेस्ट डेटा जोड़ रहा हूँ:

#!/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 के बीच स्विच करने के लिए सेटिंग्स के आधार पर ऑटो स्विच करेगा।
नटिम

4

यहाँ एक शेल स्क्रिप्ट है जिसे मैंने इस मुद्दे से निपटने के लिए एक साथ समाप्त कर दिया है। आशा है कि यह किसी को कुछ समय बचाता है।

#!/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

1

एक फ्लशप्रोजेक्ट कमांड बनाने के लिए अजगर का उपयोग करना, आप उपयोग करते हैं:

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']])

मेरा सवाल है, अगर डेटाबेस पहले से मौजूद नहीं है तो इसे कैसे करें?
नटिम

एक ही स्क्रिप्ट में उदासी से किसी भी आगे की कार्रवाई (उदाहरण के लिए syncdb) "कोई डेटाबेस चयनित" त्रुटियों में परिणाम।
टिम्मम

इसने एक कमांड किया flushdbऔर उसके बाद मैंने एक और कमांड लॉन्च किया। यदि आपको किसी अन्य स्क्रिप्ट में इसकी आवश्यकता है, तो आप उपयोग कर सकते हैंcall_command
नटिम

मैं अनुसरण नहीं करता। मैं पहले से ही उपयोग कर रहा हूं call_command। आप कह रहे हैं कि मुझे call_command("flushdb")पहले करना चाहिए call_command("syncdb")?
टिम्मम

काम नहीं करता है। वही त्रुटि। त्रुटि "कोई डेटाबेस चयनित नहीं है" इसलिए आप किसी SQL को निष्पादित नहीं कर सकते । समाधान मिला: मेरा दूसरा उत्तर देखें।
टिम्मम

1

आदेश ./manage.py sqlclearया ./manage.py sqlflushतालिका को खाली करने और उन्हें हटाने के लिए नहीं लगता है, हालांकि यदि आप पूरा डेटाबेस हटाना चाहते हैं तो यह प्रयास करें manage.py flush:।

चेतावनी: यह आपके डेटाबेस को पूरी तरह से हटा देगा और आप अपना सारा डेटा खो देंगे, इसलिए यदि महत्वपूर्ण नहीं है तो आगे बढ़ें और इसे आज़माएँ।


2
नहीं, यह गलत है। फ्लश और स्क्वाफ्लश समान है, यह सभी डेटा को हटा देता है, लेकिन फ्लॉप टेबल नहीं है। sqlflush sql प्रदर्शित करता है, लेकिन निष्पादित नहीं करता है, फ्लश इसे प्रदर्शित किए बिना निष्पादित करता है।
मोलदे

1

यहाँ कई सेटिंग्स फ़ाइलों के साथ कुछ अच्छा काम करने के लिए एक उदाहरण 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


1

यह उत्तर पोस्टग्रैक्स्ल डीबी के लिए है:

चलाएँ: गूंज 'के स्वामित्व में ड्रॉप 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': '',
}

1

यदि आप psql का उपयोग कर रहे हैं और django-more 2.0.0 स्थापित है, तो आप कर सकते हैं

manage.py reset_schema


0

यहाँ @ पीटर-जी के उत्तर का दक्षिण प्रवास संस्करण है। मैं अक्सर कच्चे 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()))

सहकर्मी / सहकर्मी मुझे मार डालते अगर उन्हें पता होता कि मैंने यह किया है, हालाँकि।


0

यदि आप अपनी सभी तालिकाओं को हटाना चाहते हैं तो और भी सरल उत्तर है। आप बस अपने फ़ोल्डर में जाते हैं जिसमें डेटाबेस होता है (जिसे mydatabase.db कहा जा सकता है) और .db फ़ाइल पर राइट-क्लिक करें और "डिलीट" करें। पुराने ढंग से, काम करने के लिए निश्चित रूप से आग।


1
केवल sqlite डेटाबेस के लिए हालांकि :-)
win24ed

0

सभी तालिकाओं को गिराता है और उन्हें पुनः बनाता है:

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; / "



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.