আমি কীভাবে ম্যানেজ.পি এবং কমান্ড লাইন ব্যবহার করে একটি ডাটাবেস থেকে সমস্ত টেবিলগুলি ফেলে দিতে পারি? উপযুক্ত পরামিতিগুলির সাথে ম্যানেজ.পি.কে কার্যকর করার কোনও উপায় আছে যাতে আমি এটি একটি নেট অ্যাপ্লিকেশন থেকে চালিয়ে দিতে পারি?
উত্তর:
আমি যতদূর জানি সমস্ত টেবিল ফেলে দেওয়ার জন্য কোনও ম্যানেজমেন্ট কমান্ড নেই। পাইথন হ্যাক করতে আপনার আপত্তি না থাকলে আপনি এটি করতে নিজের নিজস্ব কাস্টম কমান্ডটি লিখতে পারেন। আপনি sqlclear
বিকল্প আকর্ষণীয় খুঁজে পেতে পারেন । ডকুমেন্টেশন বলছে যে ./manage.py sqlclear
প্রদত্ত অ্যাপ্লিকেশন নামের (গুলি) এর জন্য ড্রপ টেবিল এসকিউএল স্টেটমেন্টগুলি মুদ্রণ করে।
আপডেট : সম্পূর্ণ উত্তর দেওয়ার জন্য নির্লজ্জভাবে @ মাইক ডিসিমনের মন্তব্যটির নীচে এই উত্তরটি নিযুক্ত করে ।
./manage.py sqlclear | ./manage.py dbshell
জঙ্গো ১.৯ এর হিসাবে এটি এখন ./manage.py sqlflush
./manage.py sqlclear myAppName | ./manage.py dbshell
সমস্ত সারণী ফেলে দেওয়ার জন্য নেটিভ জ্যাঙ্গো পরিচালনার কমান্ড নেই। উভয় sqlclear
এবং reset
একটি অ্যাপ্লিকেশন নাম প্রয়োজন।
তবে, আপনি জ্যাঙ্গো এক্সটেনশানগুলি ইনস্টল করতে পারেন যা আপনাকে দেয় manage.py reset_db
, যা আপনি যা চান ঠিক তা করে (এবং আপনাকে আরও অনেক দরকারী পরিচালনা কমান্ডে অ্যাক্সেস দেয় )।
manage.py reset_db
পতাকা-needs -সি, - ক্লোস-সেশন` প্রয়োজন ডাটাবেস ফেলে দেওয়ার আগে ডাটাবেস সংযোগ বন্ধ করতে (কেবল পোস্টগ্রিএসকিউএল)
আপনি যদি ডাটাবেস স্থানান্তর (উচ্চ প্রস্তাবিত) পরিচালনা করতে দক্ষিণ প্যাকেজটি ব্যবহার করেন তবে আপনি কেবল ./manage.py migrate appname zero
কমান্ডটি ব্যবহার করতে পারেন ।
অন্যথায়, আমি ./manage.py dbshell
কমান্ডটি সুপারিশ করব , স্ট্যান্ডার্ড ইনপুটটিতে এসকিউএল কমান্ডগুলিতে পাইপিং করব।
python manage.py migrate <app> zero
sqlclear
1.9 থেকে সরানো হয়েছে।
প্রকাশের নোটগুলিতে উল্লেখ করা হয়েছে যে এটি মাইগ্রেশন প্রবর্তনের কারণে হয়েছে: https://docs.djangoproject.com/en/1.9/relayss/1.9/
দুর্ভাগ্যক্রমে আমি এমন কোনও পদ্ধতি খুঁজে পেলাম না যা একবারে সমস্ত অ্যাপ্লিকেশনগুলিতে কাজ করে, না প্রশাসক থেকে সমস্ত ইনস্টল থাকা অ্যাপ্লিকেশন তালিকাভুক্ত করার অন্তর্নিহিত উপায়: জ্যাঙ্গোতে ম্যানেজ.পি সহ সমস্ত ইনস্টল থাকা অ্যাপ্লিকেশন কীভাবে তালিকাভুক্ত করা যায়?
এটি ব্যবহার করা আরও ভাল ./manage.py sqlflush | ./manage.py dbshell
কারণ স্ক্লোলেয়ার অ্যাপ্লিকেশন ফ্লাশ করার প্রয়োজন requires
অজগর থেকে এটি করার সহজ (?) উপায় (মাইএসকিএল):
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
আমি ব্যবস্থাপনা কমান্ড যা হবে স্বয়ংক্রিয় সুইচ SQLite3 এবং PostgreSQL মধ্যে স্যুইচ করার জন্য সেটিংসের উপর ভিত্তি করে সঙ্গে একটি জ্যাঙ্গো-পুনঃ-DB প্যাকেজ তৈরি করতে recommand।
এই সমস্যাটি মোকাবেলা করার জন্য আমি এখানে শেল স্ক্রিপ্ট একসাথে পাইকিং শেষ করেছি। আশা করি এটি কারও কিছুটা সময় সাশ্রয় করবে।
#!/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
।
সতর্কতা: এটি আপনার ডাটাবেস পুরোপুরি মুছে ফেলবে এবং আপনি আপনার সমস্ত ডেটা হারাবেন, তাই যদি গুরুত্বপূর্ণ না হয় তবে এগিয়ে যান এবং চেষ্টা করুন।
একাধিক সেটিংস ফাইল সহ কিছু সুন্দর জিনিস করার জন্য এখানে মেকফিলের একটি উদাহরণ রয়েছে:
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
এই উত্তরটি পোস্টগ্রিস্কল ডিবি-র জন্য:
রান: ইকো ' কিছু_উসারের মালিকানাধীন ড্রপ ' | ./manage.py dbshell
দ্রষ্টব্য: ডেটাবেস অ্যাক্সেস করতে আপনি ব্যবহারকারীর নাম হ'ল কিছু_ ব্যবহারকারীর নাম, সেটিংস.পি ফাইলটি দেখুন:
default_database = {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'somedbname',
'USER': 'some_user',
'PASSWORD': 'somepass',
'HOST': 'postgresql',
'PORT': '',
}
আপনি যদি পিএসকিএল ব্যবহার করেন এবং জ্যাঙ্গো-আরও ২.০.০ ইনস্টল করা থাকে তবে আপনি এটি করতে পারেন
manage.py reset_schema
@ পিটার-জি এর উত্তরের একটি দক্ষিণ মাইগ্রেশন সংস্করণ এখানে। আমি প্রায়শই কাঁচা এসকিউএল দিয়ে ঝাঁকুনি দিয়ে থাকি, তাই এটি কোনও 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()))
সহকর্মী / কোকোডাররা যদি আমাকে জানত যে আমি এটি করেছি তবে আমাকে হত্যা করবে।
আপনি যদি আপনার সমস্ত টেবিলগুলি মুছতে চান তবে একটি আরও সহজ উত্তর রয়েছে। আপনি কেবল আপনার ফোল্ডারে ডাটাবেসযুক্ত (যাকে মাইডাটাবেস.ডিবি বলা যেতে পারে) যেতে পারেন এবং .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
- "প্রদত্ত অ্যাপের নাম (গুলি) এর জন্য ড্রপ টেবিল এসকিউএল স্টেটমেন্টগুলি মুদ্রণ করে"
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 'সেড "গুলি /"; / "ক্যাসকেড; /" "এর জন্য
অন্যদের ম্যানেজ.পি টাইপ করার জন্য উইন্ডোজ 10-এ "পাইথন ম্যানেজ.পি স্ক্যাফ্লুশ" কমান্ডটি ব্যবহার করুন
আমি আপনাকে জ্যাঙ্গো-এক্সটেনশানগুলি ইনস্টল করতে এবং python manage.py reset_db
কমান্ডটি ব্যবহার করার পরামর্শ দিচ্ছি । এটি আপনি যা চান ঠিক তা করে।