Manage.py ve komut satırını kullanarak bir veritabanından tüm tabloları nasıl bırakabilirim? Manage.py'yi bir .NET uygulamasından yürütebilmek için uygun parametrelerle yürütmenin herhangi bir yolu var mı?
Yanıtlar:
Bildiğim kadarıyla tüm tabloları kaldıracak bir yönetim komutu yok. Python'u kırmaktan çekinmiyorsanız, bunu yapmak için kendi özel komutunuzu yazabilirsiniz. Bu sqlclear
seçeneği ilginç bulabilirsiniz . Belgeler , verilen uygulama adları için DROP TABLE SQL ifadelerini yazdırdığını söylüyor ./manage.py sqlclear
.
Güncelleme : Tam bir cevap vermek için @Mike DeSimone'nin bu cevabın altındaki yorumunu utanmazca kullanıyorum .
./manage.py sqlclear | ./manage.py dbshell
Django 1.9'dan itibaren artık ./manage.py sqlflush
./manage.py sqlclear myAppName | ./manage.py dbshell
Tüm tabloları bırakacak yerel bir Django yönetim komutu yoktur. Her ikisi de sqlclear
ve reset
bir uygulama adı gerektirir.
Ancak, size tam olarak istediğinizi yapan (ve daha birçok yararlı yönetim komutuna erişim sağlayan) Django Extensions'ı kurabilirsiniz .manage.py reset_db
manage.py reset_db
veritabanını bırakarak önce yakın veritabanı bağlantıları bayrağı `-c, --close-sessions` ihtiyacı (PostgreSQL için)
Veritabanı geçişlerini işlemek için Güney paketini kullanıyorsanız (şiddetle tavsiye edilir), o zaman sadece ./manage.py migrate appname zero
komutu kullanabilirsiniz .
Aksi takdirde, ./manage.py dbshell
standart girişte SQL komutlarında borulama komutunu öneririm .
python manage.py migrate <app> zero
sqlclear
1.9'dan kaldırıldı.
Sürüm notları, bunun geçişlerin başlamasından kaynaklandığını belirtmektedir: https://docs.djangoproject.com/en/1.9/releases/1.9/
Maalesef aynı anda tüm uygulamalarda çalışan bir yöntem veya yöneticiden tüm yüklü uygulamaları listelemenin yerleşik bir yolunu bulamadım: Manage.py ile tüm yüklü uygulamaları Django'da nasıl listeleyebilirim?
python'dan yapmanın basit (?) yolu (mysql'de):
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)
Veritabanını tamamen silmek ve aynı anda yeniden senkronize etmek istiyorsanız, aşağıdaki gibi bir şeye ihtiyacınız vardır. Ayrıca bu komutta test verilerini eklemeyi birleştiriyorum:
#!/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() # ...
Yapabilmek güzel olurdu, cursor.execute(call_command('sqlclear', 'main'))
ancak call_command
SQL'i bir dizge olarak döndürmek yerine standart çıktıya yazdırıyor ve sql_delete
kodu çözemiyorum ...
USE DATABASE
Ben SQLite3 et PostgreSQL arasında geçiş yapmak için ayarlara dayalı hangi irade oto anahtarı bir yönetim komutuyla bir django-Tekrar Oluştur-db paket oluşturmak için size salık vermek.
İşte bu sorunu çözmek için bir araya getirdiğim bir kabuk betiği. Umarım birine biraz zaman kazandırır.
#!/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
Komut ./manage.py sqlclear
veya ./manage.py sqlflush
tamamladıktan veritabanı bunu deneyin silmek istiyor ancak eğer bunları silmek tablo temizlemek değil gibi görünüyor: manage.py flush
.
Uyarı: Bu, veritabanınızı tamamen silecek ve tüm verilerinizi kaybedeceksiniz, bu yüzden önemli değilse, devam edin ve deneyin.
Bir flushproject komutu oluşturmak için Python kullanarak şunları kullanırsınız:
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
ve başka bir komut başlattıktan sonra. başka bir komut dosyasında ihtiyacınız varsa, şunu kullanabilirsinizcall_command
call_command
. Daha call_command("flushdb")
önce yapmam gerektiğini call_command("syncdb")
mi söylüyorsun ?
İşte birden çok ayar dosyasıyla bazı güzel şeyler yapmak için bir Makefile örneği:
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
O zaman aşağıdaki gibi şeyler yapabilirsiniz:
$ make db_reset
Bu cevap postgresql DB içindir:
Çalıştır: echo ' bazı_kullanıcıya ait drop ' | ./manage.py dbshell
NOT: bazı_kullanıcılar , veritabanına erişmek için kullandığınız kullanıcının adıdır, bkz. Settings.py dosyası:
default_database = {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'somedbname',
'USER': 'some_user',
'PASSWORD': 'somepass',
'HOST': 'postgresql',
'PORT': '',
}
Psql kullanıyorsanız ve django-more 2.0.0 yüklüyse, şunları yapabilirsiniz:
manage.py reset_schema
İşte @ peter-g'nin cevabının güneye göç versiyonu. Sık sık ham sql ile oynarım, bu yüzden bu, karışık uygulamalar için 0001_initial.py olarak kullanışlıdır. Yalnızca destekleyen DB'lerde çalışır SHOW TABLES
(mysql gibi). SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
PostgreSQL kullanıyorsanız, bunun yerine bir şey koyun. Ayrıca, sık sık her ikisi için bu da aynı işi görüyor forwards
ve backwards
göçler.
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()))
İş arkadaşları / kodlayıcılar, bunu yaptığımı bilselerdi beni öldürürdü.
TÜM tablolarınızı silmek istiyorsanız daha da basit bir cevap var. Veritabanını (veritabanım.db olarak adlandırılabilir) içeren klasörünüze gidin ve .db dosyasına sağ tıklayın ve "sil" seçeneğine basın. Eski moda yol, kesinlikle işe yarayacak.
Tüm tabloları bırakır ve yeniden oluşturur:
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
Açıklama:
manage.py sqlclear
- "verilen uygulama adları için DROP TABLE SQL deyimlerini yazdırır"
sed -n "2,$p"
- ilk satır hariç tüm hatları yakalar
sed -n "$ !p"
- son satır hariç tüm hatları yakalar
sed "s/";/" CASCADE;/"
- tüm noktalı virgülleri (;) (CASCADE;) ile değiştirir
sed -e "1s/^/BEGIN;/" -e "$s/$/COMMIT;/"
- ilk metin olarak ekler (BEGIN;), son metin olarak ekler (COMMIT;)
manage.py dbshell
- "ENGINE ayarınızda belirtilen veritabanı motoru için komut satırı istemcisini KULLANICI, PAROLA, vb. Ayarlarınızda belirtilen bağlantı parametreleriyle çalıştırır"
manage.py syncdb
- "INSTALLED_APPS içindeki tabloları henüz oluşturulmamış tüm uygulamalar için veritabanı tabloları oluşturur"
Bağımlılıklar:
Kredi:
@Manoj Govindan ve @Mike DeSimone sqlclear için dbshell'e aktarıldı
'sed "s /"; / "CASCADE; /"' için @jpic
Windows 10'da "python manage.py sqlflush" komutunu kullanın, diğerleri manage.py yazın
Django uzantılarını kurmanızı ve python manage.py reset_db
command kullanmanızı tavsiye ederim . Tam olarak ne istiyorsan onu yapar.