ฉันจะวางตารางทั้งหมดจากฐานข้อมูลโดยใช้ Manage.py และ command line ได้อย่างไร มีวิธีใดบ้างที่จะดำเนินการ Manage.py ด้วยพารามิเตอร์ที่เหมาะสมเพื่อให้ฉันสามารถเรียกใช้งานจากแอปพลิเคชัน. NET ได้
ฉันจะวางตารางทั้งหมดจากฐานข้อมูลโดยใช้ Manage.py และ command line ได้อย่างไร มีวิธีใดบ้างที่จะดำเนินการ Manage.py ด้วยพารามิเตอร์ที่เหมาะสมเพื่อให้ฉันสามารถเรียกใช้งานจากแอปพลิเคชัน. NET ได้
คำตอบ:
เท่าที่ฉันรู้ไม่มีคำสั่งการจัดการเพื่อวางตารางทั้งหมด หากคุณไม่สนใจที่จะแฮ็ก Python คุณสามารถเขียนคำสั่งของคุณเองเพื่อทำเช่นนั้น คุณอาจพบว่า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 Extensionsซึ่งให้manage.py reset_db
สิ่งที่คุณต้องการ (และให้คุณเข้าถึงคำสั่งการจัดการที่มีประโยชน์อื่น ๆ อีกมากมาย )
manage.py reset_db
ต้องการแฟล็ก `-c, --close-sessions` เพื่อปิดการเชื่อมต่อฐานข้อมูลก่อนที่จะทิ้งฐานข้อมูล (PostgreSQL เท่านั้น)
หากคุณใช้แพ็คเกจ South เพื่อจัดการการย้ายฐานข้อมูล (แนะนำเป็นอย่างยิ่ง) คุณสามารถใช้./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/
น่าเสียดายที่ฉันไม่พบวิธีการที่ใช้ได้กับแอพทั้งหมดในคราวเดียวหรือวิธีในตัวในการแสดงรายการแอพที่ติดตั้งทั้งหมดจากผู้ดูแลระบบ: จะแสดงรายการแอพที่ติดตั้งทั้งหมดด้วย Manage.py ใน Django ได้อย่างไร
ที่เกี่ยวข้อง: จะรีเซ็ตการย้ายข้อมูลใน Django 1.7 ได้อย่างไร
ใช้ดีกว่า./manage.py sqlflush | ./manage.py dbshell
เพราะ sqlclear ต้องใช้แอพในการล้าง
วิธีง่ายๆ (?) ในการทำจาก python (บน 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 เป็น stdout แทนที่จะส่งคืนเป็นสตริงและฉันไม่สามารถหาsql_delete
รหัสได้ ...
USE DATABASE
ฉันขอแนะนำให้คุณสร้างแพ็คเกจ django-create-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
การใช้ Python เพื่อสร้างคำสั่ง flushproject คุณใช้:
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
คำตอบนี้มีไว้สำหรับ postgresql DB:
เรียกใช้: echo 'drop เป็นของsome_user ' | ./manage.py dbshell
หมายเหตุ: some_userคือชื่อของผู้ใช้ที่คุณใช้เพื่อเข้าถึงฐานข้อมูลโปรดดูที่ไฟล์ settings.py:
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
นี่คือคำตอบของ @ peter-g เวอร์ชันอพยพทางใต้ ฉันมักจะเล่นกับ sql แบบดิบดังนั้นสิ่งนี้จึงมีประโยชน์ในฐานะ 0001_initial.py สำหรับแอปที่สับสน จะใช้ได้เฉพาะกับฐานข้อมูลที่รองรับ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
- "รันไคลเอนต์บรรทัดคำสั่งสำหรับเอ็นจิ้นฐานข้อมูลที่ระบุในการตั้งค่า ENGINE ของคุณพร้อมพารามิเตอร์การเชื่อมต่อที่ระบุในการตั้งค่า USER รหัสผ่าน ฯลฯ "
manage.py syncdb
- "สร้างตารางฐานข้อมูลสำหรับแอปทั้งหมดใน INSTALLED_APPS ที่ยังไม่ได้สร้างตาราง"
การพึ่งพา:
เครดิต:
@Manoj Govindan และ @Mike DeSimone สำหรับ sqlclear piped ไปยัง dbshell
@jpic สำหรับ 'sed "s /"; / "CASCADE; /"'
ใช้คำสั่ง "python Manage.py sqlflush" ใน windows 10 สำหรับคนอื่น ๆ ให้พิมพ์ Manage.py
ฉันอยากจะแนะนำให้คุณติดตั้งdjango-extensionsและใช้python manage.py reset_db
คำสั่ง มันทำในสิ่งที่คุณต้องการ