Django: әр кестеден барлық деректерді алып тастаңыз (бірақ кестелерді өздері сақтаңыз)

Мен екі джанго орнату (өндіріс және тестілеу) арасындағы деректерді синхрондауға тырысамын. Мен оны ./ manage.py dumpdata --natural , содан кейін ./ manage.py loaddata </​​code> қолданып, жаңа syncdb тестілеу бойынша деректер базасы.

Мен жаңа рұқсатты қосқанша бәрі жақсы жұмыс істеді. syncdb өнімі бос дерекқорда жаңа syncdb қарағанда жаңа рұқсатты басқа әр түрлі тәртіппен (әр түрлі бастапқы кілтпен) қотарады. Демек, ол басқа идентификаторға ие болады. Сондықтан, табиғи кілттерді қолдануға қарамастан, деректерді жүктеуге тырысқан кезде, бірінші рет рұқсат жоқ нысан жүктелгенде, мен бұл қатені аламын:

IntegrityError: duplicate key value violates unique constraint "auth_permission_content_type_id_codename_key"

Түзетуді орнатудың әрбір кестесіндегі барлық деректерді жою үшін, яғни кестені жасау үшін syncdb пайдалануды және бастапқы деректерді жүктеуді емес, оны түзету туралы ойлайтынымның ең оңай жолы. Бірақ syncdb бастапқы деректерді/сигналдар қадамын өткізіп жіберуге мүмкіндік бермейді. Әрбір модельді немесе кесте атын нақты санауды қысқартқан жоқ, syncdb деп атағаннан кейін барлық бастапқы деректерді қалай жоюға болады? Немесе syncdb қолданбай бос кестелерді жасаудың жолы бар ма?

./manage.py flush isn't what I'm after -- it reloads initial data and triggers syncdb signals.

10

2 жауаптар

Flush пәрменіне сәйкес (мен Django 1.3.1 қолданамын) SQL орындалатын SQL - бұл ./ manage.py sqlflush алынған бірдей SQL, содан кейін бастапқы дереккөздер қайта орнатылады .

$ python manage.py help flush 
Usage: manage.py flush [options]

Executes ``sqlflush`` on the current database.

Деректерді өшіру мүмкіндігін алу үшін, флеш-тиеу жүктемесін алу үшін сіз SQL-ге ./ manage.py sqlflush қоңырау шалып, одан кейін SQL-ді ерікті SQL-ді орындау үшін Django-ның ендірілген қолдауы арқылы орындай аласыз:

from django.core.management import call_command, setup_environ
from your_django_project import settings
setup_environ(settings)

from django.db import connection
from StringIO import StringIO

def main():
    # 'call' manage.py flush and capture its outputted sql
    command_output = StringIO()
    call_command("sqlflush", stdout=command_output)

    command_output.seek(0)
    flush_sql = command_output.read()

    # execute the sql
    # from: https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly
    cursor = connection.cursor()
    cursor.execute(flush_sql)

    print "db has been reset"

if __name__ == '__main__':
    main()

Бұған қосылмаған пайдасы бар, сіз SQL-ті өзгерте алмайтын кестелерді болдырмау үшін ./ manage.py sqlflush -ден өзгерте аласыз.

Сондай-ақ, ағымдағы Django құжаттарына сәйкес , Django 1.5 жаңа параметр ./ manage.py flush - non-initial-data </​​code> деректерді қалпына келтіреді және бастапқы деректерді жүктемейді.

9
қосылды

For Django <= 1.4, you can use the reset management command.

./manage.py sqlreset myapp1 myapp2
0
қосылды
1.5-де жойылды. өкінішке орай, бірде-бір бағдарламаны тазалау тәсілі сияқты көрінбейді :(
қосылды автор Andre, көзі
reset деп сілтеме жасайтын құжаттар сияқты ескірген; бірақ мен сізден аулақ болғым келетін әрбір бағдарламаны санауды талап етеді. Қоқыс - оны ауыстыру; бірақ бастапқы деректерді жүктейді.
қосылды автор user85461, көзі
ескірген, сіз оны пайдалана алмайсыз дегенді білдірмейді. Бағдарлама атауын санамағыңыз келмесе, өзіңіздің басқару пәрменіңізді жазуыңыз керек.
қосылды автор Alasdair, көзі