2011-10-28 11 views
10

Próbuję zsynchronizować dane między dwiema instalacjami django (produkcja i testowanie). Robię to za pomocą ./manage.py dumpdata --natural na produkcji, a następnie ./manage.py loaddata w świeżo syncdb 'ed bazy danych na temat testowania.Django: Usuń wszystkie dane z każdej tabeli (ale same tabele)

Wszystko działało poprawnie, dopóki nie dodałem nowego uprawnienia niestandardowego. Produkcja syncdb ładowała to nowe uprawnienie w innej kolejności (z innym kluczem podstawowym) niż nowy syncdb w pustej bazie danych. W rezultacie otrzymuje inny identyfikator. Więc mimo użyciu naturalnych klucze, gdy próbuję załadować dane, dostaję ten błąd, gdy pierwszy out-of-order przedmiot uprawnienie jest załadowany:

IntegrityError: duplicate key value violates unique constraint "auth_permission_content_type_id_codename_key" 

Najłatwiej można myślę, aby to naprawić jest usunięcie wszystkich danych z każdej tabeli w testowej instalacji - to jest użycie syncdb tylko do tworzenia tabel, a nie do ładowania danych początkowych. Ale syncdb nie pozwala pominąć początkowego kroku danych/sygnałów. Bez wyraźnego wymieniania każdego modelu lub nazwy tabeli, w jaki sposób mogę usunąć wszystkie początkowe dane po wywołaniu syncdb? Czy istnieje sposób na tworzenie tylko pustych tabel bez używania syncdb?

./manage.py flush to nie jest to, czego szukam - odświeża dane początkowe i wyzwala sygnały syncdb.

Odpowiedz

9

Według pomoc dla spłukiwania Command (Używam Django 1.3.1) SQL, który jest wykonywany jest taka sama SQL uzyskane z ./manage.py sqlflush, a następnie początkowe mecze dane są ponownie zainstalowany.

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

Executes ``sqlflush`` on the current database. 

Aby uzyskać te same możliwości wycierania dane minus ładowanie Uchwyt można uzyskać SQL wywołując ./manage.py sqlflush a następnie wykonać że SQL przy użyciu Django wbudowane wsparcie dla wykonywania funkcji SQL:

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() 

ten Dodatkową korzyścią jest to, że możesz zmodyfikować SQL z ./manage.py sqlflush przed wykonaniem, aby uniknąć wymazywania tabel, które możesz pozostawić nietknięte.

Ponadto, zgodnie z the current Django docs, w Django 1.5 nowy parametr ./manage.py flush --no-initial-data zresetuje dane i nie załaduje początkowego urządzenia danych.

0

Dla Django < = 1,4, można użyć polecenia zarządzania reset.

./manage.py sqlreset myapp1 myapp2 
+1

Resetowanie jest przestarzałe, ponieważ dokumenty, które podasz, wspominają; ale wymaga to wyliczenia każdej aplikacji, której chcę uniknąć. Flush jest jego zamiennikiem; ale ładuje początkowe dane. – user85461

+0

przestarzałe nie oznacza, że ​​nie możesz z niego korzystać. Jeśli nie chcesz wymieniać nazw aplikacji, myślę, że będziesz musiał napisać własne polecenie zarządzania. – Alasdair

+0

Usunięto w wersji 1.5. niestety nie wygląda na to, że istnieje już sposób na spłukanie pojedynczej aplikacji :( – Andre

Powiązane problemy