জাজানোতে ম্যানেজ.পি সিএলআই দিয়ে ডাটাবেস থেকে সমস্ত টেবিল কীভাবে বাদ যাবে?


95

আমি কীভাবে ম্যানেজ.পি এবং কমান্ড লাইন ব্যবহার করে একটি ডাটাবেস থেকে সমস্ত টেবিলগুলি ফেলে দিতে পারি? উপযুক্ত পরামিতিগুলির সাথে ম্যানেজ.পি.কে কার্যকর করার কোনও উপায় আছে যাতে আমি এটি একটি নেট অ্যাপ্লিকেশন থেকে চালিয়ে দিতে পারি?

উত্তর:


128

আমি যতদূর জানি সমস্ত টেবিল ফেলে দেওয়ার জন্য কোনও ম্যানেজমেন্ট কমান্ড নেই। পাইথন হ্যাক করতে আপনার আপত্তি না থাকলে আপনি এটি করতে নিজের নিজস্ব কাস্টম কমান্ডটি লিখতে পারেন। আপনি sqlclearবিকল্প আকর্ষণীয় খুঁজে পেতে পারেন । ডকুমেন্টেশন বলছে যে ./manage.py sqlclear প্রদত্ত অ্যাপ্লিকেশন নামের (গুলি) এর জন্য ড্রপ টেবিল এসকিউএল স্টেটমেন্টগুলি মুদ্রণ করে।

আপডেট : সম্পূর্ণ উত্তর দেওয়ার জন্য নির্লজ্জভাবে @ মাইক ডিসিমনের মন্তব্যটির নীচে এই উত্তরটি নিযুক্ত করে

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

জঙ্গো ১.৯ এর হিসাবে এটি এখন ./manage.py sqlflush


sqlclear "ড্রপ স্টেটমেন্টগুলি মুদ্রণ করে" তবে কীভাবে তাদের একক কমান্ড লাইনে কল করতে হবে
কমলুর

4
: তোমার মত অ্যাপের নাম প্রয়োজন./manage.py sqlclear myAppName | ./manage.py dbshell
Montaro

4
এটি মোটেই কাজ করে না। sqlclear এর একটি অ্যাপের নাম প্রয়োজন। আমি জ্যাঙ্গো 1.8 এ আছি
জোনাথন হার্টলি

4
কেবল সচেতন থাকুন যে স্ক্যালফ্লাশটি টেবিলগুলি ফেলে না, এটি তাদের কেটে দেয়। এছাড়াও এই অপারেশনটি সম্ভবত আপনার পোস্টগ্র্যাস্কিল ডিবিতে কাজ করবে না যদি আপনি স্ক্যালফ্লুশ দ্বারা উত্পন্ন ট্রাঙ্কেট কমান্ডের শেষে CASCADE কীওয়ার্ডটি যুক্ত না করেন।
ব্যবহারকারী3748764

39

সমস্ত সারণী ফেলে দেওয়ার জন্য নেটিভ জ্যাঙ্গো পরিচালনার কমান্ড নেই। উভয় sqlclearএবং resetএকটি অ্যাপ্লিকেশন নাম প্রয়োজন।

তবে, আপনি জ্যাঙ্গো এক্সটেনশানগুলি ইনস্টল করতে পারেন যা আপনাকে দেয় manage.py reset_db, যা আপনি যা চান ঠিক তা করে (এবং আপনাকে আরও অনেক দরকারী পরিচালনা কমান্ডে অ্যাক্সেস দেয় )।


@ জুলিয়েনগ্রিড আপডেট হয়েছে ধন্যবাদ!
অনুজ গুপ্ত

4
আমি চেষ্টা ছেড়ে দিয়েছি এবং এটি ব্যবহার করেছি।
লাফস্টে

এটি আমার পক্ষে কাজ করেছে, যদিও উচ্চতর স্থানের উত্তরগুলির কোনওটিই করেনি।
জোনাথন হার্টলি

4
@ অঞ্জজ গুপ্তা প্রায়শই manage.py reset_dbপতাকা-needs -সি, - ক্লোস-সেশন` প্রয়োজন ডাটাবেস ফেলে দেওয়ার আগে ডাটাবেস সংযোগ বন্ধ করতে (কেবল পোস্টগ্রিএসকিউএল)
ভ্যালারি রামুসিক

34

আপনি যদি ডাটাবেস স্থানান্তর (উচ্চ প্রস্তাবিত) পরিচালনা করতে দক্ষিণ প্যাকেজটি ব্যবহার করেন তবে আপনি কেবল ./manage.py migrate appname zeroকমান্ডটি ব্যবহার করতে পারেন ।

অন্যথায়, আমি ./manage.py dbshellকমান্ডটি সুপারিশ করব , স্ট্যান্ডার্ড ইনপুটটিতে এসকিউএল কমান্ডগুলিতে পাইপিং করব।


+1 যে কোনও অ-তুচ্ছ জ্যাঙ্গো প্রকল্পের দক্ষিণ ব্যবহার করা উচিত। এবং একবার আপনি দক্ষিণ ব্যবহার করেন তারপরে জিরোতে মাইগ্রেট করা সমস্ত টেবিলগুলি বাদ দেওয়ার একটি দুর্দান্ত প্রতিমা পদ্ধতি।
মনোজ গোবিন্দন

এমনকি তুচ্ছ জ্যাঙ্গো প্রকল্পগুলির দক্ষিণ বিবেচনা করা উচিত। কেবলমাত্র লোকেরা ডাটাবেসগুলিতে স্থানান্তরিত হতে অভ্যস্ত হতে পারে এবং তাই তারা হাত থেকে ডেটা ডাম্প করার চেষ্টা, হ্যাক করা এবং পুনরায় লোড করা বা ডেটা মাইগ্রেট করার জন্য ফিক্সচার পদ্ধতি ব্যবহারের মতো খারাপ অভ্যাসগুলি শেখে না।
মাইক ডিসিমোন

আমি দক্ষিণ ব্যবহার করি, তবে আমি প্রতি স্থানান্তরের জন্য বিপরীত মাইগ্রেশন লিখতে বিরক্ত করি না: কমপক্ষে ডেটা মাইগ্রেশন নয়। এবং আমি এটি করব না তাই আমি শূন্য বিকল্পটি ব্যবহার করতে পারি। অবশ্যই এটি পরীক্ষার একটি ভাল উপায় যা আপনি / পারেন / ডানদিকে শূন্যে ফিরে যেতে পারেন, যদি তা আপনার কাছে গুরুত্বপূর্ণ। সমস্ত টেবিল বাদ দেওয়া আমার পক্ষে যুক্তিসঙ্গত বলে মনে হচ্ছে।
tobych

26

python manage.py migrate <app> zero

sqlclear 1.9 থেকে সরানো হয়েছে।

প্রকাশের নোটগুলিতে উল্লেখ করা হয়েছে যে এটি মাইগ্রেশন প্রবর্তনের কারণে হয়েছে: https://docs.djangoproject.com/en/1.9/relayss/1.9/

দুর্ভাগ্যক্রমে আমি এমন কোনও পদ্ধতি খুঁজে পেলাম না যা একবারে সমস্ত অ্যাপ্লিকেশনগুলিতে কাজ করে, না প্রশাসক থেকে সমস্ত ইনস্টল থাকা অ্যাপ্লিকেশন তালিকাভুক্ত করার অন্তর্নিহিত উপায়: জ্যাঙ্গোতে ম্যানেজ.পি সহ সমস্ত ইনস্টল থাকা অ্যাপ্লিকেশন কীভাবে তালিকাভুক্ত করা যায়?

সম্পর্কিত: জাজানো 1.7 এ মাইগ্রেশন কীভাবে পুনরায় সেট করবেন?


12

এটি ব্যবহার করা আরও ভাল ./manage.py sqlflush | ./manage.py dbshellকারণ স্ক্লোলেয়ার অ্যাপ্লিকেশন ফ্লাশ করার প্রয়োজন requires


7

অজগর থেকে এটি করার সহজ (?) উপায় (মাইএসকিএল):

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আমি ব্যবস্থাপনা কমান্ড যা হবে স্বয়ংক্রিয় সুইচ SQLite3 এবং PostgreSQL মধ্যে স্যুইচ করার জন্য সেটিংসের উপর ভিত্তি করে সঙ্গে একটি জ্যাঙ্গো-পুনঃ-DB প্যাকেজ তৈরি করতে recommand।
নাতিম

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

আমার প্রশ্ন, ডাটাবেস ইতিমধ্যে বিদ্যমান না থাকলে এটি কীভাবে সম্পাদন করবেন?
নাতিম

দুর্ভাগ্যক্রমে একই স্ক্রিপ্টে পরবর্তী কোনও ক্রিয়াকলাপ (যেমন সিঙ্কডিবি) এর ফলে "কোনও ডাটাবেস নির্বাচিত হয়নি" ফলাফল হয়।
টিএমএমএম

এটি একটি কমান্ড করেছে flushdbএবং আমি আরও একটি কমান্ড চালু করার পরে। আপনার যদি অন্য স্ক্রিপ্টে এটির প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেনcall_command
নাতিম

আমি অনুসরণ করি না আমি ইতিমধ্যে ব্যবহার করছি call_command। আপনি বলছেন আমার call_command("flushdb")আগে করা উচিত call_command("syncdb")?
টিম্ম্ম্ম

কাজ করে না। একই ত্রুটি। ত্রুটিটি "কোনও ডাটাবেস নির্বাচিত নয়" সুতরাং আপনি কোনও এসকিউএল চালাতে পারবেন না । সমাধানটি খুঁজে পেয়েছি: আমার অন্যান্য উত্তর দেখুন।
টিমম্মে

1

কমান্ড ./manage.py sqlclearবা ./manage.py sqlflushটেবিল পরিষ্কার এবং তাদের মুছে অবশ্য যদি তোমরা সম্পূর্ণ ডাটাবেসের এই চেষ্টা মুছে ফেলতে চান বলে মনে হয়: manage.py flush

সতর্কতা: এটি আপনার ডাটাবেস পুরোপুরি মুছে ফেলবে এবং আপনি আপনার সমস্ত ডেটা হারাবেন, তাই যদি গুরুত্বপূর্ণ না হয় তবে এগিয়ে যান এবং চেষ্টা করুন।


4
না, এটি ভুল। ফ্লাশ এবং স্ক্লফল্লাশ একই, এটি সমস্ত ডেটা সরিয়ে দেয়, তবে ড্রপ টেবিলগুলি না। sqlflush sql প্রদর্শন করে তবে কার্যকর করে না, ফ্লাশ এটি প্রদর্শন না করেই এটি কার্যকর করে।
মোল্ডে

1

একাধিক সেটিংস ফাইল সহ কিছু সুন্দর জিনিস করার জন্য এখানে মেকফিলের একটি উদাহরণ রয়েছে:

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

এই উত্তরটি পোস্টগ্রিস্কল ডিবি-র জন্য:

রান: ইকো ' কিছু_উসারের মালিকানাধীন ড্রপ ' | ./manage.py dbshell

দ্রষ্টব্য: ডেটাবেস অ্যাক্সেস করতে আপনি ব্যবহারকারীর নাম হ'ল কিছু_ ব্যবহারকারীর নাম, সেটিংস.পি ফাইলটি দেখুন:

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

1

আপনি যদি পিএসকিএল ব্যবহার করেন এবং জ্যাঙ্গো-আরও ২.০.০ ইনস্টল করা থাকে তবে আপনি এটি করতে পারেন

manage.py reset_schema


0

@ পিটার-জি এর উত্তরের একটি দক্ষিণ মাইগ্রেশন সংস্করণ এখানে। আমি প্রায়শই কাঁচা এসকিউএল দিয়ে ঝাঁকুনি দিয়ে থাকি, তাই এটি কোনও befuddled অ্যাপ্লিকেশনগুলির জন্য 0001_initial.py হিসাবে কার্যকর হয়। এটি কেবলমাত্র ডিবিগুলিতে কাজ করবে যা সমর্থন করে SHOW TABLES( মাইএসকিএল )। SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';আপনি পোস্টগ্রেএসকিউএল ব্যবহার করার মতো কিছু বিকল্প করুন । এছাড়াও, আমি প্রায়শই উভয় 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

আপনি যদি আপনার সমস্ত টেবিলগুলি মুছতে চান তবে একটি আরও সহজ উত্তর রয়েছে। আপনি কেবল আপনার ফোল্ডারে ডাটাবেসযুক্ত (যাকে মাইডাটাবেস.ডিবি বলা যেতে পারে) যেতে পারেন এবং .db ফাইলটিতে ডান ক্লিক করুন এবং "মুছুন" চাপুন। পুরানো ফ্যাশন উপায়, কাজ করতে নিশ্চিত আগুন।


4
শুধুমাত্র স্ক্লাইট ডেটাবেসের জন্য যদিও :-)

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 - "প্রদত্ত অ্যাপের নাম (গুলি) এর জন্য ড্রপ টেবিল এসকিউএল স্টেটমেন্টগুলি মুদ্রণ করে"

sed -n "2,$p" - প্রথম লাইন ব্যতীত সমস্ত লাইন ধরে

sed -n "$ !p" - শেষ লাইন ব্যতীত সমস্ত লাইন ধরে

sed "s/";/" CASCADE;/" - সমস্ত সেমিকোলন (;) এর সাথে (ক্যাসকেড;) প্রতিস্থাপন করে

sed -e "1s/^/BEGIN;/" -e "$s/$/COMMIT;/" - প্রথম পাঠ্য হিসাবে সন্নিবেশ (বিগইন;), সর্বশেষ পাঠ্য হিসাবে সন্নিবেশ (COMMIT;)

manage.py dbshell - "আপনার ব্যবহারকারী, পাসওয়ার্ড, ইত্যাদি, সেটিংসে উল্লিখিত সংযোগ পরামিতিগুলির সাথে আপনার ইঞ্জিন সেটিং-এ উল্লিখিত ডাটাবেস ইঞ্জিনের জন্য কমান্ড-লাইন ক্লায়েন্ট চালায়"

manage.py syncdb - "INSTALLED_APPS এর সমস্ত অ্যাপ্লিকেশনের জন্য ডাটাবেস টেবিল তৈরি করে যার টেবিলগুলি ইতিমধ্যে তৈরি করা হয়নি"

নির্ভরতা:


ক্রেডিট:

স্কোলেচারের জন্য মনোজ গোবিন্দন এবং @ মাইক ডিসিমোন dbshell টি পাইপ করেছেন

@jpic 'সেড "গুলি /"; / "ক্যাসকেড; /" "এর জন্য



আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.