PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

wartość zbyt długa dla typu character variing(100) ----ostatnio przełączona baza danych, nic nie zostało zrobione w db

Nie sądzę, że potrzebujesz pomocy w rozwiązaniu tego problemu, tak bardzo, jak potrzebujesz pomocy w jego debugowaniu. Gdy problem jest jasny, rozwiązanie również wydaje się jasne. Traceback jest być może nieco niejasny, ponieważ przechodzi przez tak dużo kodu źródłowego Django i nie mówi, które z twoich pól jest problematyczne.

Tło tego problemu

Na początek mamy problemy z zapisaniem Post instancja. Cóż, spójrz na wszystkie te pola, które masz w definicji modelu:

 ...
  url = models.URLField(max_length=250, blank=True, null=True)
  video = EmbedVideoField(verbose_name='link',help_text="Youtube", blank=True, null=True) 
  content = RichTextUploadingField(config_name='default')
  image = models.ImageField(upload_to='images',blank=True, null=True)
  thumbnail = models.ImageField(upload_to='images', blank=True, null=True)

Mogą one nie wyglądać pola tekstowe, ale wiele z nich to odmiany pól tekstowych, ponieważ jeśli się nad tym zastanowisz, prawdopodobnie nie będziesz przechowywać całych plików w Twojej bazie danych. Zamiast tego (i co robi Django domyślnie) przechowasz plik gdzieś na jakimś dysku, a następnie w bazie danych będziesz przechowywać ścieżkę do tego pliku, dzięki czemu można go odzyskać, gdy zajdzie taka potrzeba.

Co więcej, prawdopodobnie marnotrawstwem jest przechowywanie ścieżek plików w bazie danych jako LongText lub cokolwiek, więc każde FileField mamy oznacza, że ​​mamy pole z max_length czy to określamy, czy nie. Zatem wszystkie powyższe pola mają niejawną max_length . Możesz się tego dowiedzieć, czytając kod źródłowy Django.

Przykłady źródłowe

Nigdy nie korzystałem z EmbedVideoField , na przykład, ale okazuje się, że jest to podklasa models.URLField , co oznacza, że ​​ma max_length domyślnie ustawiono na 200 jeśli nie określisz żadnego.

Co więcej, twoje różne ImageField są po prostu podklasami FileField , który ma max_length domyślnie 100 .

Jak debugować takie problemy w przyszłości?

To nie pomaga nam wiedzieć, który z twoich pól zgłasza błąd w tym przypadku. W tym celu prawdopodobnie ustawiłbym punkt przerwania gdzieś w kodzie, prawdopodobnie tutaj:

File "ebagu/main/models.py" in save
   66.       super(Post, self).save(*args, **kwargs)

Przez „ustaw punkt przerwania” rozumiem:

Przejdź do wiersza 65 w module wspomnianym powyżej, ebagu/main/models.py i wpisz i zapisz moduł:import pdb; pdb.set_trace()

(Właściwie mam silną preferencję dla ipdb ja, ale to wymaga Ipythona, który również bardzo lubię...)

Uruchom serwer lokalny i wykonaj kroki, które spowodowały ten problem. W końcu prześlesz formularz i jeśli spojrzysz na konsolę, w której uruchomiłeś serwer, w końcu zostaniesz zrzucony do powłoki dokładnie w wierszu 65. Ta powłoka to powłoka pdb , która ma inne reguły niż normalna powłoka, ale możesz ocenić swój Post, który ma zostać zapisany przykład, patrząc na różne pola w samej instancji, self i uruchomienie kodu Pythona w kontekście wywołania tej metody:

(pdb) len(self.image.path)

Korzystając z tego, ręcznie oceniłbym różne pola i sprawdził, które z nich ma ten naprawdę długi wpis, który blokuje zapis (prawdopodobnie jedno z twoich ImageField s).

Rozwiązanie z ostrzeżeniami

Alternatywnie możesz po prostu dodać max_length do wszystkich z nich, ale pamiętaj, że najprawdopodobniej będziesz musiał wykonać migracje bazy danych dla dowolnego ograniczonego pola tekstowego, które zmienisz, ponieważ Twoja baza danych nadal będzie weryfikować długość danych wejściowych ze sposobem zdefiniowania kolumny. Oto dobra odpowiedź StackOverflow dotycząca dokładnie tego problemu .

Przypis

Dlaczego nie pojawiło się to przed przejściem na Postgresql? Istnieje wiele potencjalnych przyczyn, ale prawdopodobnie ma to związek z konfiguracją poprzedniej bazy danych w porównaniu z konfiguracją bazy danych Postgresql (ręcznie w porównaniu z migracjami Django?).

Może to również mieć związek z tym, czy zmieniłeś miejsce przechowywania tych rzeczy. Czy zmieniłeś MEDIA ustawienia, więc ścieżki, w których przechowywane są pliki, są znacznie dłuższe?

To, co naprawdę powinieneś robić, to patrzeć bezpośrednio na swoją bazę danych. Otwórz psql przykład i poproś go o opisanie twoich tabel dla ciebie. Powie ci, które pola są ograniczone do 100 znaków i są to pola, które sprawiają problemy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. GROUP lub DISTINCT po JOIN zwraca duplikaty

  2. GdzieRaw Laravel ze zmienną

  3. Jak przełączać bazy danych w psql?

  4. Ogranicz relację klucza obcego do wierszy powiązanych podtypów

  5. Jak zaimportować istniejące pliki *.sql w PostgreSQL 8.4?