sql >> Databáze >  >> RDS >> PostgreSQL

hodnota je příliš dlouhá pro typový znak varying(100)----nedávno přepnutá databáze, v db nic neudělalo

Nemyslím si, že potřebujete pomoc s vyřešením tohoto problému, stejně jako potřebujete pomoc s jeho laděním. Jakmile je problém jasný, řešení se zdá být jasné. Traceback je možná trochu nejasný, protože prochází tolik zdrojovým kódem Django a neřekne vám, které z vašich polí má problém.

Pozadí tohoto problému

Za prvé, máme problémy s ukládáním příspěvku instance. Podívejte se na všechna tato pole, která máte v definici 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)

Tyto nemusí vypadat textová pole, ale mnoho z nich jsou variacemi textových polí, protože když se nad tím zamyslíte, pravděpodobně nebudete ukládat celé soubory ve vaší databázi. Co místo toho uděláte (a to, co Django dělá ve výchozím nastavení), je uložit soubor někam na nějaký disk a pak do databáze uložit cestu k tomuto souboru, abyste jej mohli v případě potřeby načíst.

Dále je pravděpodobně zbytečné ukládat cesty k souborům v db jako LongText nebo cokoliv jiného, ​​tedy každý FileField we have znamená, že máme pole s max_length ať už to specifikujeme nebo ne. Všechna výše uvedená pole tedy mají implicitní max_length . Ve skutečnosti to můžete zjistit přečtením zdrojového kódu Django.

Příklady zdrojů

EmbedVideoField jsem nikdy nepoužil , ale ukáže se, že je to podtřída models.URLField , což znamená, že má max_length ve výchozím nastavení pokud žádný neuvedete.

Navíc vaše různé ImageField s jsou pouze podtřídy FileField ,

"Nastavit bod přerušení" mám na mysli následující:

Přejděte na řádek 65 ve výše uvedeném modulu, ebagu/main/models.py a zadejte následující a uložte modul:import pdb; pdb.set_trace()

(Vlastně velmi preferuji ipdb já, ale to vyžaduje Ipython, který také velmi preferuji...)

Spusťte místní server a proveďte kroky, které způsobily tento problém. Nakonec odešlete svůj formulář, a když se podíváte na konzolu, kde jste spustili svůj server, nakonec se dostanete do shellu přímo na řádku 65. Tento shell je pdb shell , který má jiná pravidla než běžný shell, ale můžete vyhodnotit svůj Příspěvek, který se chystáte uložit instanci, když se podíváte na různá pole na samotné instanci, self a spuštění kódu Pythonu v kontextu volání této metody:

(pdb) len(self.image.path)

Pomocí toho bych ručně vyhodnotil různá pole a podíval se, které z nich má tento opravdu dlouhý záznam, který škrtí uložení (pravděpodobně jedno z vašich ImageField s).

Řešení s upozorněními

Případně můžete jednoduše přidat max_length na všechny z nich, ale mějte na paměti, že s největší pravděpodobností budete muset provést migraci databáze pro jakékoli omezené textové pole, které změníte, protože vaše databáze bude stále ověřovat délku vstupu oproti tomu, jak je sloupec definován. Zde je dobrá odpověď StackOverflow zabývající se přesně tímto problémem .

Poznámka pod čarou

Proč se to neobjevilo předtím, než jste přešli na Postgresql? Existuje celá řada možných důvodů, ale pravděpodobně to souvisí s tím, jak byla nastavena předchozí databáze a jak byla nastavena databáze Postgresql (manuálně vs migrace Django?).

Může to také souviset s tím, zda jste změnili místo, kde jsou tyto věci uloženy, či nikoli. Změnili jste MEDIA nastavení, takže cesty, kde jsou soubory uloženy, jsou mnohem delší?

Co byste opravdu měli dělat, je podívat se přímo do vaší databáze. Otevřete psql a požádejte jej, aby vám popsal vaše tabulky. Řekne vám, která pole jsou omezena na 100 znaků, a to jsou pole, která vám dělají problémy.



  1. uWSGI, Flask, sqlalchemy a postgres:Chyba SSL:dešifrování se nezdařilo nebo špatný záznam mac

  2. Používání relačních databází MySQL na Gentoo

  3. Zpět k příkazovému řádku sqlplus

  4. Vytvořte spouštěč, který při aktualizaci sloupce vloží hodnoty do nové tabulky