sql >> Database >  >> RDS >> PostgreSQL

waarde te lang voor type karakter variërend (100) ---- onlangs van database veranderd, deed niets in db

Ik denk niet dat je hulp nodig hebt bij het oplossen van dit probleem, maar wel hulp bij het debuggen ervan. Als het probleem eenmaal duidelijk is, lijkt de oplossing ook duidelijk. De Traceback is misschien een beetje onduidelijk omdat het zoveel Django-broncode doorloopt en je niet vertelt welke van je velden een probleem hebben.

Achtergrond van dit probleem

Om te beginnen hebben we problemen met het opslaan van een Post voorbeeld. Kijk naar al deze velden in uw modeldefinitie:

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

Deze mogen er niet lijken tekstvelden, maar veel ervan zijn variaties op tekstvelden, want als je erover nadenkt, ga je waarschijnlijk niet hele bestanden opslaan in uw databank. Wat u in plaats daarvan zult doen (en wat Django standaard doet) is het bestand ergens op een schijf op te slaan en vervolgens in de database zou u het pad opslaan naar dat bestand, zodat u het kunt ophalen wanneer dat nodig is.

Verder is het waarschijnlijk zonde om bestandspaden in de db op te slaan als LongText of wat dan ook, dus elk FileField we hebben middelen dat we een veld hebben met een max_length of we het nu specificeren of niet. Alle bovenstaande velden hebben dus een impliciete max_length . Je kunt dit achterhalen door de broncode van Django te lezen.

Bronvoorbeelden

Ik heb EmbedVideoField nog nooit gebruikt , maar het blijkt bijvoorbeeld een subklasse van models.URLField , wat betekent dat het een max_length . heeft standaard ingesteld op 200 als u er geen opgeeft.

Bovendien kunnen uw verschillende ImageField s zijn slechts subklassen van FileField , met een max_length standaard van 100 .

Hoe debug je dit soort problemen in de toekomst?

Dit helpt ons niet om te weten welke van uw velden geeft in dit geval een foutmelding. Daarvoor zou ik waarschijnlijk ergens in de code een breekpunt instellen, waarschijnlijk hier:

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

Met "een breekpunt instellen", bedoel ik het volgende:

Ga naar regel 65 in de hierboven genoemde module, ebagu/main/models.py en voer het volgende in en sla de module op:import pdb; pdb.set_trace()

(Ik heb eigenlijk een sterke voorkeur voor ipdb mezelf, maar daarvoor heb ik Ipython nodig, waar ik ook een sterke voorkeur voor heb...)

Voer uw lokale server uit en doorloop de stappen die dit probleem hebben veroorzaakt. Je zult uiteindelijk je formulier indienen en als je naar de console kijkt waar je je server hebt gestart, word je uiteindelijk in een shell gedumpt op regel 65. Deze shell is een pdb-shell , die andere regels heeft dan een normale shell, maar je kunt je op te slaan Post evalueren bijvoorbeeld door te kijken naar de verschillende velden op de instantie zelf, self , en het uitvoeren van Python-code in de context van die methodeaanroep:

(pdb) len(self.image.path)

Als ik dat zou gebruiken, zou ik de verschillende velden handmatig evalueren en kijken welke deze echt lange invoer heeft die de opslag verstikt (waarschijnlijk een van uw ImageField s).

Oplossing met waarschuwingen

Als alternatief kunt u gewoon een max_length . toevoegen op al deze, maar wees gewaarschuwd dat u hoogstwaarschijnlijk databasemigraties zult moeten uitvoeren voor elk beperkt tekstveld dat u wijzigt, omdat uw database nog steeds de lengte van de invoer gaat vergelijken met hoe de kolom is gedefinieerd. Hier is een goed StackOverflow-antwoord dat precies naar dit probleem kijkt .

Voetnoot

Waarom kwam dit niet ter sprake voordat u overstapte naar Postgresql? Er zijn verschillende mogelijke redenen, maar het heeft waarschijnlijk te maken met hoe de vorige database was opgezet versus hoe de Postgresql-database was opgezet (handmatig versus Django-migraties?).

Het kan ook te maken hebben met het feit of u al dan niet hebt gewijzigd waar deze dingen worden opgeslagen. Heb je je MEDIA . gewijzigd? instellingen zodat de paden waar bestanden worden opgeslagen een stuk langer zijn geworden?

Wat u echt zou moeten doen, is rechtstreeks naar uw database kijken. Open een psql bijvoorbeeld en vraag het om uw tabellen voor u te beschrijven. Het zal u vertellen welke velden beperkt zijn tot 100 tekens en dat zijn de velden die u problemen geven.



  1. UPDATE op INSERT dubbele primaire sleutel in Oracle?

  2. Wamp Server opnieuw installeren zonder de bestaande mysql-database te vervangen

  3. Hoe te tellen in een join-instructie

  4. Hoe DataContext.ExecuteCommand te gebruiken en de uitgevoerde opgeslagen proc-retourwaarde te krijgen?