Zmiana tabel bazy danych w Django

głosy
59

Jestem rozważa wykorzystanie Django dla projektu Zaczynam (FYI, gry oparte na przeglądarce), a jedną z cech najbardziej ja jestem lubiących używa syncdbdo automatycznego tworzenia tabel baz danych opartych na modelach Django zdefiniować (a funkcja, która nie może się znaleźć w żadnym innym ram). Ja już myślałem, że to było zbyt piękne, aby mogło być prawdziwe, kiedy zobaczyłem to w dokumentacji :

Syncdb nie zmieni istniejących tabel

syncdb utworzy jedynie tabele dla modeli, które nie zostały jeszcze zainstalowane. To nigdy nie wyda oświadczenia ALTER TABLE pasujące do zmian wprowadzonych do klasy modelu po instalacji. Zmiany w klasach modeli i schematów baz danych często wymagają jakiejś formy dwuznaczności i w tych przypadkach, Django musiałaby odgadnąć poprawnych zmiany wprowadzić. Istnieje ryzyko, że dane krytyczne zostaną utracone w procesie.

Jeśli wprowadzono zmiany do modelu i chcą zmieniać tabele bazy danych, aby dopasować, użyj polecenia SQL, aby wyświetlić nową strukturę SQL i porównać go do istniejącego schematu tabeli wypracować zmiany.

Wydaje się, że zmiana istniejących tabel będą musiały być zrobione „ręcznie”.

Co chciałbym wiedzieć, jest najlepszym sposobem, aby to zrobić. Dwa rozwiązania przychodzą do głowy:

  • Jako dokumentacja wskazuje, ręcznie dokonać zmian w projekcie budżetu;
  • Wykonaj kopię zapasową bazy danych, należy go utworzyć tabele ponownie (z syncdb, ponieważ teraz jest tworzenie tabel od podstaw) i importować dane z kopii zapasowej (może to trwać zbyt długo, jeśli baza danych jest duża)

Jakieś pomysły?

Utwórz 30/08/2008 o 13:36
źródło użytkownik
W innych językach...                            


8 odpowiedzi

głosy
59

Ręcznie robi zmiany SQL i zrzucić / reload są obie opcje, ale może również chcesz sprawdzić niektóre z pakietów schemat ewolucji dla Django. Najbardziej dojrzałe opcje są django-ewolucja i Południowej .

EDIT : I hej, tu dmigrations .

UPDATE : Ponieważ ta odpowiedź została pierwotnie napisana, django-ewolucja i dmigrations mieć zarówno przestał aktywny rozwój i Południowej stał się de facto standardem dla migracji schematu w Django. Części południu może być nawet zintegrowane Django w następnej wersji lub dwa.

UPDATE : schemat-migracje framework oparty na Południu (i autorstwa Andrew Godwin, autor Południa) jest zawarty w Django 1.7+.

Odpowiedział 30/08/2008 o 13:56
źródło użytkownik

głosy
9

Dobrym sposobem na to jest za pomocą uchwytów, zwłaszcza initial_dataurządzeń.

Zespół mocujący jest zbiorem plików, które zawierają odcinkach zawartości bazy danych. Więc to tak jakby mieć kopię zapasową bazy danych, ale jak to jest coś Django ma świadomość, że to łatwiejsze w użyciu i będzie mieć dodatkowe korzyści, gdy przyjdziesz do robienia rzeczy, takich jak testowanie jednostkowe.

Można stworzyć urządzenie od danych obecnie w swoją DB użyciu django-admin.py dumpdata. Domyślnie dane w formacie JSON, ale inne opcje, takie jak XML są dostępne. Dobrym miejscem do przechowywania osprzętu jest fixturessub-katalog katalogów aplikacji.

Można załadować fixure użyciu django-admin.py loaddata, ale bardziej istotny, jeśli urządzenie ma nazwę jak initial_data.jsonzostanie on automatycznie ładowany podczas zrobić syncdb, oszczędzając kłopotów z importu samodzielnie.

Inną korzyścią jest to, że po uruchomieniu manage.py test, aby uruchomić moduł Testy Test tymczasowej bazy danych będzie miał również wstępnych danych Spotkań załadowany.

Oczywiście, będzie to działać, gdy podczas dodawania atrybutów do modeli i kolumn do DB. Jeśli spadek kolumny z bazy danych trzeba zaktualizować urządzenie do usuwania danych dla danej kolumny, które może nie być proste.

To działa najlepiej, gdy robi wiele małych zmian w bazie danych w czasie rozwoju. Do aktualizacji produkcja DBS ręcznie wygenerowanego skryptu SQL często działają najlepiej.

Odpowiedział 30/08/2008 o 13:57
źródło użytkownik

głosy
4

Używam Django ewolucję. Ostrzeżenia obejmują:

  • Jego automatyczne sugestie były jednakowo zgniłe; i
  • Jego funkcja fingerprint zwraca różne wartości dla tej samej bazy danych na różnych platformach.

Mimo to, uważam, że zwyczaj schema_evolution.pypodejście przydać. Aby obejść ten problem odcisków palców, proponuję kodu, takich jak:

BEFORE = 'fv1:-436177719' # first fingerprint
BEFORE64 = 'fv1:-108578349625146375' # same, but on 64-bit Linux
AFTER = 'fv1:-2132605944' 
AFTER64 = 'fv1:-3559032165562222486'

fingerprints = [
    BEFORE, AFTER,
    BEFORE64, AFTER64,
    ]

CHANGESQL = """
    /* put your SQL code to make the changes here */
    """

evolutions = [
    ((BEFORE, AFTER), CHANGESQL),
    ((BEFORE64, AFTER64), CHANGESQL)
    ]

Gdybym miał więcej palców i zmiany, to bym go ponownie-Factor. Do tego czasu, dzięki czemu czystsze byłaby kradzież czas rozwoju od czegoś innego.

EDIT: Biorąc pod uwagę, że mam ręcznie konstruowania moje zmiany tak, postaram dmigrations następnym razem.

Odpowiedział 11/09/2008 o 01:44
źródło użytkownik

głosy
3

django-command-extensions jest biblioteką Django, który daje kilka dodatkowych poleceń manage.py. Jednym z nich jest sqldiff, co powinno dać sql potrzebne do aktualizacji do nowego modelu. To jest, jednakże, wymienione jako "bardzo doświadczalnych.

Odpowiedział 11/09/2008 o 22:33
źródło użytkownik

głosy
16

Jak zauważono w innych odpowiedzi do tego samego tematu, należy obserwować DjangoCon 2008 Schema Evolution panelu na YouTube.

Także dwa nowe projekty na mapie: Simplemigrations i wędrownych .

Odpowiedział 09/10/2008 o 11:16
źródło użytkownik

głosy
2

Do tej pory w moim towarzystwie użyliśmy metody ręcznej. Co działa najlepiej dla Ciebie zależy w dużej mierze od stylu rozwojowej.

Na ogół nie tak wiele zmian schematu w systemach produkcyjnych i nieco sformalizowanych wdrożeń z rozwojem na serwerach produkcyjnych. Kiedykolwiek rozwałkować (10-20 razy w roku) robimy diff wypełnienia obecny i zbliżający się oddział produkcyjny przeglądając cały kod i zauważając, co musi zostać zmienione na serwerze produkcyjnym. Wymagane zmiany mogą być dodatkowe zależności, zmiany w pliku ustawień i zmian do bazy danych.

To działa bardzo dobrze dla nas. Mając to wszystko zautomatyzowane jest nisza wizja ale trudne dla nas - być może uda nam migracje, ale wciąż musiałby obsługiwać dodatkowe biblioteki, serwer, niezależnie od zależności.

Odpowiedział 04/01/2009 o 13:26
źródło użytkownik

głosy
2

Książka Django wyjaśnia, jak to zrobić ręcznie.

http://www.djangobook.com/en/2.0/chapter10/

Zrobiłem to tak wiele razy, i to jest bardzo elastyczny, dzięki czemu można pozostawić dane w tabelach podczas usuwania ich z modelu.

Zacząłem używać South niedawno. Wydaje się nieco mniej elastyczne (lub może po prostu trzeba przeczytać docs trochę więcej.), Ale można zaoszczędzić trochę pisania. Czasami uda Ci się zdobyć z zsynchronizowane z bazą danych, która jest koszmarem. To wydaje się iść w porządku tak długo, jak zachować używając it.It wydaje się związać modeli i rzeczywistej bazy danych razem, co może lub nie może być dobre w zależności od sytuacji

Odpowiedział 13/06/2012 o 07:24
źródło użytkownik

głosy
2

Django 1.7 (obecnie w budowie) jest dodanie natywne wsparcie dla migracji schematu z manage.py migratei manage.py makemigrations( migratedeprecates syncdb).

Odpowiedział 17/12/2013 o 15:23
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more