2012-08-16 11 views
7

Używając django-south, można ustawić tabelę tylko do ostatniej, najnowszej konfiguracji bez stosowania wszystkich wcześniejszych migracji?Nie można uzyskać zainstalowanych tabel bazy danych Django-Activity-Stream

Jesteśmy zainteresowani korzystaniem z zewnętrznego narzędzia (django-activity-stream), ale mamy problemy z uruchomieniem wszystkich migracji, z nieco nieznanych przyczyn (prawdopodobnie problemów z MySQL dotyczących konkretnego pola) - w szczególności migracji 003, która podnosi błąd

_mysql_exceptions.OperationalError: (1170, "BLOB/TEXT column 'object_id' used in key specification without a key length") " I strongly suspect that avoiding the migrations and going straight to the current schema will avoid this.

możliwość migracji do tyłu nie jest wymagane, tylko potrzebę, żeby nas do aktualnego schematu teraz, i nie chcę, aby włamać pakiet do czynienia z tym. Nie mogę wydawać poleceń ani czy jest to możliwe?

config:

południe 0.7.6, Django 1.3.x, mysql 5.5.x, django-aktywność strumień 0.4.4

+0

Widzę ten sam błąd na Django 1.4 podczas uruchamiania migracji –

+1

strasznie przepraszam, jeśli się mylę, ponieważ nie ma czasu na testowanie, ale dlaczego nie można po prostu zrobić manage.py syncdb - all, a następnie zarządzać. py migrować - fałszywy? –

+0

uwaga: musisz ręcznie usunąć tabele dla aplikacji z bazy danych, jeśli zostały one utworzone w niewłaściwym stanie podczas poprzednich ćwiczeń, przed powyższym działaniem. –

Odpowiedz

4

Ten błąd nadchodzi z powodu sposobu, w jaki actstream obsługuje swoje Ogólne klucze obce. Problem pojawia się w MySql, ponieważ widzi pola tekstowe bez określonej długości .

Ten błąd można usunąć, powodując migrację 0003 a no-op.

zmienić następujące rzeczy w migracjach 0003_text_field_ids, 0004_char_field_ids w actstream:

0003_text_field_ids.py:

  1. usunąć wszystko w def forwards(self, orm), def backwards(self, orm) i po prostu napisać pass w obu.
  2. Zmień TextField na PositiveIntegerField.

0004_char_field_ids.py:

  1. W def backwards(self, orm) zmień TextField do PositiveIntegerField we wszystkich db.altercolumns().

To sprawia, że ​​migracja 0003 noop użyciu przepustkę do przodu i do tyłu i korzysta Definicja modelu PositiveIntegerFields za klucze Generic Zagranicznych, więc są one utrzymywane w takim samym stanie jak migracja 0001 opuścił je. W ten sposób migracja 0004 może zostać zmieniona z PositiveIntegerFields na varChars. Następnie poprawka zmienia migrację 0004, aby migracja wsteczna zmieniła się na PositiveIntegerFields zamiast TextFields.

To powinno poprawić Twój problem.

2

nie sądzę problem jest spowodowany przez migracje, nawet syncdb będzie daje taki sam wynik.

Błąd nadchodzi, ponieważ MySQL może indeksować tylko pierwszych N znaków w kolumnie BLOB lub TEXT. Musisz więc mieć typ pola/kolumny TEKSTU lub BLOBa, który próbujesz utworzyć jako klucz podstawowy lub indeks.

Z pełnym BLOB lub tekst bez wartości długości, MySQL nie będzie w stanie zagwarantować unikalność kolumny jak to zmiennego i dynamicznego wielkości. Tak więc, gdy używane są typy BLOB lub TEXT jako indeks, należy podać wartość N, aby MySQL mógł określić długość klucza.

Spróbuj rozwiązać ten problem, a następnie spróbuj zastosować migrację, powinna dobrze działać. i Tak, możesz zastosować dowolne migracje i pominąć starsze, ale zalecam, aby tego nie robić, ponieważ nie jest to sposób wykorzystania południa.

Mam nadzieję, że wszystko wyjaśniłem.