PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wert zu lang für Typzeichen Variant (100)----kürzlich Datenbank gewechselt, hat nichts in db gemacht

Ich glaube nicht, dass Sie Hilfe bei der Behebung dieses Problems benötigen, sondern eher Hilfe beim Debuggen. Sobald das Problem klar ist, scheint auch die Lösung klar zu sein. Das Traceback ist vielleicht etwas unklar, weil es so viel Django-Quellcode durchläuft und Ihnen nicht sagt, welches Ihrer Felder ein Problem hat.

Hintergrund dieser Ausgabe

Zunächst einmal haben wir Probleme beim Speichern eines Post Beispiel. Schauen Sie sich all diese Felder an, die Sie in Ihrer Modelldefinition haben:

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

Diese dürfen nicht so aussehen Textfelder, aber viele von ihnen sind Variationen von Textfeldern, denn wenn Sie darüber nachdenken, werden Sie wahrscheinlich nicht ganze Dateien speichern in Ihrer Datenbank. Was Sie stattdessen tun werden (und was Django standardmäßig tut), ist, die Datei irgendwo auf einer Festplatte zu speichern und dann in der Datenbank den Pfad zu speichern zu dieser Datei, damit Sie sie bei Bedarf abrufen können.

Außerdem ist es wahrscheinlich eine Verschwendung, Dateipfade in der Datenbank als LongText zu speichern oder was auch immer, also jedes FileField we have bedeutet, dass wir ein Feld mit einer max_length haben ob wir es angeben oder nicht. Daher haben alle oben genannten Felder eine implizite max_length . Sie können dies tatsächlich herausfinden, indem Sie den Django-Quellcode lesen.

Quellenbeispiele

Ich habe EmbedVideoField noch nie verwendet , aber es stellt sich als eine Unterklasse von models.URLField , was bedeutet, dass es eine max_length hat standardmäßig auf 200 gesetzt wenn Sie keine angeben.

Außerdem Ihre verschiedenen ImageField s sind nur Unterklassen von FileField , das einen max_length Standardwert 100 .

Wie kann man solche Probleme in Zukunft debuggen?

Nun, das hilft uns nicht zu wissen, welche Ihrer Felder gibt in diesem Fall einen Fehler aus. Dafür würde ich wahrscheinlich irgendwo im Code einen Breakpoint setzen, wahrscheinlich hier:

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

Mit "Haltepunkt setzen" meine ich Folgendes:

Gehen Sie zu Zeile 65 im oben erwähnten Modul ebagu/main/models.py und geben Sie Folgendes ein und speichern Sie das Modul:import pdb; pdb.set_trace()

(Eigentlich habe ich eine starke Vorliebe für ipdb selbst, aber das erfordert Ipython, das ich auch stark bevorzuge...)

Führen Sie Ihren lokalen Server aus und führen Sie die Schritte durch, die dieses Problem verursacht haben. Am Ende senden Sie Ihr Formular und wenn Sie sich die Konsole ansehen, in der Sie Ihren Server gestartet haben, werden Sie schließlich direkt in Zeile 65 in eine Shell geworfen. Diese Shell ist ein PDB-Shell , die andere Regeln als eine normale Shell hat, aber Sie können Ihren zu speichernden Post auswerten Instanz, indem Sie sich die verschiedenen Felder der Instanz selbst ansehen, self , und Ausführen von Python-Code im Kontext dieses Methodenaufrufs:

(pdb) len(self.image.path)

Damit würde ich die verschiedenen Felder manuell auswerten und nachsehen, welches diesen wirklich langen Eintrag hat, der das Speichern erstickt (wahrscheinlich eines Ihrer ImageField s).

Lösung mit Warnungen

Alternativ können Sie einfach eine max_length hinzufügen zu all diesen, aber seien Sie gewarnt, dass Sie höchstwahrscheinlich Datenbankmigrationen durchführen müssen für jedes begrenzte Textfeld, das Sie ändern, da Ihre Datenbank immer noch die Länge der Eingabe anhand der Definition der Spalte überprüft. Hier ist eine gute StackOverflow-Antwort, die sich genau mit diesem Problem beschäftigt .

Fußnote

Warum ist das nicht aufgetaucht, bevor Sie zu Postgresql gewechselt sind? Es gibt eine Vielzahl möglicher Gründe, aber es hat wahrscheinlich damit zu tun, wie die vorherige Datenbank eingerichtet wurde im Vergleich zur Einrichtung der Postgresql-Datenbank (manuelle vs. Django-Migrationen?).

Es kann auch damit zu tun haben, ob Sie den Speicherort dieser Dinge geändert haben oder nicht. Haben Sie Ihre MEDIA geändert? Einstellungen, sodass die Pfade, in denen Dateien gespeichert werden, viel länger wurden?

Was Sie wirklich tun sollten, ist, direkt in Ihre Datenbank zu schauen. Öffnen Sie ein psql Beispiel und bitten Sie es, Ihre Tabellen für Sie zu beschreiben. Es wird Ihnen sagen, welche Felder auf 100 Zeichen begrenzt sind und welche Felder Ihnen Probleme bereiten.