sql >> Databasteknik >  >> RDS >> PostgreSQL

värde för långt för typ tecken varierande (100)----nyligen bytte databas, gjorde ingenting i db

Jag tror inte att du behöver hjälp med att fixa det här problemet, så mycket som du behöver hjälp med att felsöka det. När problemet väl är klart verkar lösningen också vara klar. Spårningen är kanske lite otydlig eftersom den går igenom så mycket Django-källkod och den talar inte om vilka av dina fält som har problem.

Bakgrund till detta nummer

Till att börja med har vi problem med att spara ett Post exempel. Tja, titta på alla dessa fält du har i din modelldefinition:

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

Dessa kanske inte ser ut textfält, men många av dem är varianter av textfält eftersom du, om du tänker efter, förmodligen inte kommer att lagra hela filer i din databas. Vad du kommer att göra istället (och vad Django gör som standard) är att lagra filen någonstans på någon disk och sedan i databasen skulle du lagra sökvägen till den filen så att du kan hämta den när du behöver.

Dessutom är det förmodligen ett slöseri att lagra filsökvägar i db som LongText eller vad som helst, så varje FileField vi har betyder att vi har ett fält med en max_length oavsett om vi specificerar det eller inte. Således har alla ovanstående fält en implicit max_length . Du kan faktiskt ta reda på detta genom att läsa Django-källkoden.

Källexempel

Jag har aldrig använt EmbedVideoField , till exempel, men det visar sig vara en underklass av models.URLFeld , vilket betyder att den har en max_length som standard

Med "ställ in en brytpunkt" menar jag följande:

Gå till rad 65 i modulen som nämns ovan, ebagu/main/models.py och skriv in följande och spara modulen:import pdb; pdb.set_trace()

(Jag har faktiskt en stark preferens för ipdb själv, men det kräver Ipython, vilket jag också har en stark förkärlek för...)

Kör din lokala server och gå igenom stegen som orsakade det här problemet. Det slutar med att du skickar in ditt formulär och om du tittar på konsolen där du startade din server kommer du så småningom att dumpas i ett skal precis vid rad 65. Detta skal är en pdb-skal , som har andra regler än ett vanligt skal, men du kan utvärdera ditt Inlägg som ska sparas. instans, genom att titta på de olika fälten på själva instansen, self , och kör Python-kod i sammanhanget för det metodanropet:

(pdb) len(self.image.path)

Med det skulle jag manuellt utvärdera de olika fälten och titta på vilken som har den här riktigt långa posten som stryper lagringen (förmodligen en av dina ImageField s).

Lösning med varningar

Alternativt kan du bara lägga till en max_length till alla dessa, men tänk på att du med största sannolikhet kommer att behöva utföra databasmigreringar för ett begränsat textfält du ändrar eftersom din databas fortfarande kommer att verifiera längden på inmatningen mot hur kolumnen är definierad. Här är ett bra StackOverflow-svar som tittar på exakt det här problemet .

Fotnot

Varför dök inte detta upp innan du bytte till Postgresql? Det finns en mängd potentiella orsaker, men det har förmodligen att göra med hur den tidigare databasen konfigurerades kontra hur Postgresql-databasen konfigurerades (manuellt kontra Django-migreringar?).

Det kan också ha att göra med om du har ändrat var dessa saker lagras eller inte. Har du ändrat din MEDIA inställningar så att sökvägarna där filerna lagras blev mycket längre?

Vad du egentligen borde göra är att titta direkt på din databas. Öppna en psql och be den beskriva dina tabeller för dig. Det kommer att berätta vilka fält som är begränsade till 100 tecken och det är de fält som ger dig problem.



  1. Låsa en MySQL INNODB-rad i PHP

  2. PHP/MySQL försöker få TIMESTAMPDIFF att mata ut ett resultat

  3. Ansluta till mysql 5.0-databas med rent vbscript?

  4. Vi är ledsna, men något gick fel. efter utplacering till Heroku