sql >> Database teknologi >  >> RDS >> PostgreSQL

værdien er for lang til type karakter varierende (100) ------for nylig skiftet database, gjorde ikke noget i db

Jeg tror ikke, du har brug for hjælp til at løse dette problem, så meget som du har brug for hjælp til at fejlfinde det. Når først problemet er klart, virker løsningen også klar. Sporingen er måske lidt uklar, fordi den gennemgår så meget Django-kildekode, og den fortæller dig ikke, hvilke af dine felter der har et problem.

Baggrund for dette nummer

Til at begynde med har vi problemer med at gemme et Post eksempel. Nå, se på alle disse felter, du har i din modeldefinition:

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

Disse ligner muligvis ikke tekstfelter, men mange af dem er variationer af tekstfelter, fordi hvis du tænker over det, vil du sandsynligvis ikke gemme hele filer i din database. Det du vil gøre i stedet for (og hvad Django gør som standard) er at gemme filen et sted på en disk, og derefter i databasen vil du gemme stien til den fil, så du kan hente den, når du har brug for det.

Ydermere er det sandsynligvis spild at gemme filstier i db'en som LongText eller hvad som helst, så hvert FileField vi har betyder, at vi har et felt med en max_length om vi angiver det eller ej. Således har alle ovenstående felter en implicit max_length . Du kan faktisk finde ud af dette ved at læse Django-kildekoden.

Kildeeksempler

Jeg har aldrig brugt EmbedVideoField , for eksempel, men det viser sig at være en underklasse af models.URLFeld , hvilket betyder, at den har en max_length som standard hvis du ikke angiver en.

Desuden dine forskellige ImageField s er blot underklasser af FileField ,

Med "indstil et brudpunkt" mener jeg følgende:

Gå til linje 65 i modulet nævnt ovenfor, ebagu/main/models.py og indtast følgende og gem modulet:import pdb; pdb.set_trace()

(Jeg har faktisk en stærk præference for ipdb mig selv, men det kræver Ipython, som jeg også har stor forkærlighed for...)

Kør din lokale server, og kør gennem de trin, der forårsagede dette problem. Du vil ende med at indsende din formular, og hvis du ser på konsollen, hvor du startede din server, vil du til sidst blive dumpet ind i en shell lige ved linje 65. Denne shell er en pdb shell , som har andre regler end en normal shell, men du kan evaluere dit Post, der skal gemmes, instans, ved at se på de forskellige felter på selve instansen, self , og kører Python-kode i konteksten af ​​det metodekald:

(pdb) len(self.image.path)

Ved at bruge det, ville jeg manuelt evaluere de forskellige felter og se på, hvilken af ​​dem der har denne virkelig lange post, der kvæler lagringen (sandsynligvis en af ​​dine ImageField s).

Løsning med advarsler

Alternativt kan du bare tilføje en max_length til alle disse, men vær opmærksom på, at du højst sandsynligt skal udføre databasemigreringer for ethvert begrænset tekstfelt, du ændrer, fordi din database stadig vil verificere længden af ​​input i forhold til, hvordan kolonnen er defineret. Her er et godt StackOverflow-svar, der ser på netop dette problem .

Fodnote

Hvorfor dukkede dette ikke op, før du skiftede til Postgresql? Der er en række potentielle årsager, men det har sandsynligvis at gøre med, hvordan den tidligere database blev sat op i forhold til hvordan Postgresql-databasen blev sat op (manuelt vs. Django-migreringer?).

Det kan også have at gøre med, om du har ændret, hvor disse ting bliver opbevaret. Har du ændret din MEDIA indstillinger, så stierne, hvor filerne gemmes, blev meget længere?

Hvad du virkelig bør gøre er at se direkte på din database. Åbn en psql og bed den om at beskrive dine borde for dig. Den fortæller dig, hvilke felter der er begrænset til 100 tegn, og det er de felter, der giver dig problemer.



  1. Hvordan sys.dm_exec_describe_first_result_set virker i SQL Server

  2. Vis flere poster i træk

  3. Flere en til mange relationer i GORM

  4. Sådan fungerer DATE_ADD() i MariaDB