Django MySQL-Warnungen filtern

8

Bevor Sie mich alle auf hier und hier meins ein bisschen anders. So fing ich an, den berühmten Fehler zu bekommen, nachdem ich auf meinen Produktionsserver gewechselt hatte.

  

django / db / backends / mysql / base.py: 86: Warnung: Daten für Spalte 'slug' in Zeile 1 abgeschnitten

Das erste, was ich getan habe, war, das zu googeln, nachdem ich das Problem behoben habe. Um das zu beheben, habe ich beide Modelle so optimiert, dass sie eine max_length von 128 ad haben, und dann die SQL-Tabellen aktualisiert, um sie anzupassen. Aber das Problem ist geblieben ... Etwas zuversichtlich, dass ich das Problem tatsächlich behoben habe, dachte ich, dass ich genauso gut anfangen würde, sie herauszufiltern. Also habe ich das am Anfang meines Skripts platziert.

%Vor%

Und ich habe das gerne in die Produktion gebracht. Raten Sie was - Sie haben es erraten, das Problem ist geblieben. Also jetzt was. Ich verliere schnell das Vertrauen, dass ich tatsächlich das Problem gelöst habe, aber eine doppelte Überprüfung zeigt, dass alle Slug-Spalten 128 Zeichen lang sind. Desweiteren habe ich sluggify um den Fehler gewickelt, wenn es länger als 128 ist und immer noch nichts. Also 2 Fragen:

  1. Wie kann ich herausfinden, welche Operation? kennzeichnet dies. d. h. wo in meinem Code wird die Flagge angehoben?

  2. Wie könnte ich diese wirklich herausfiltern? Mein Fix funktioniert nicht? Ist das wirklich eine Warnung von MySQLdb oder eine django.db.mysql.base-Warnung?

Danke und glücklich Django hacken!

Für diejenigen, die Fragen zur Struktur haben ..

%Vor%

Und die relevanten models.py.

%Vor%

Hoffe das hilft ..

    
rh0dium 04.08.2010, 19:50
quelle

2 Antworten

3

Erstens würde ich dringend davon abraten, Warnungen wie diese zu filtern: Dieser Fehler wird von MySQL erzeugt und bedeutet absolut, dass Sie Daten verlieren.

Als erstes sollten Sie den Befehl mysql describe verwenden, um sicherzustellen, dass Ihre Datenbankspalte tatsächlich in der erwarteten Größe definiert ist: Django unterstützt keine Datenbankmigrationen, wenn Sie die Länge einer Spalte ändern Wenn Ihr Slug-Feld jemals kürzer war als jetzt, müssten Sie die Tabelle manuell ändern, um die neue Länge festzulegen:

%Vor%

Wenn dieses Feld nicht Ihren Erwartungen entsprach, können Sie das Problem einfach lösen, indem Sie die Spaltenlänge aktualisieren:

%Vor%

Wenn Sie Unicode-Zeichen in Ihren Slugs zulassen, könnte dies auch erklären, dass Ihr Dump den latin1 -Zeichensatz anstelle von UTF-8 - Ein einzelnes UTF-8-Zeichen kann bis zu 4 Byte Daten enthalten, was bedeutet, dass ein Wert von nur 17 Byte einen VARCHAR(64) überlaufen kann.

Ein nächster Debugging-Schritt ist eine einfache Variante des Anrufs, den Sie zum Filtern von Warnungen ausführen, um genau herauszufinden, wo Ihre Fehler auftreten:

%Vor%

Dies wird die Warnung fatal machen, was Ihr Programm zum Stillstand bringt, aber noch wichtiger ist, dass es auch einen Stacktrace erzeugt. Mit etwas wie diesem sehen Sie die Ausgabe unten:

%Vor%

Ohne den einfachen Filter-Aufruf:

%Vor%

Mit dem simplefilter Anruf:

%Vor%     
Chris Adams 06.07.2012, 13:58
quelle
1

Ich würde die settings.py -Datei meines Projekts bearbeiten, damit dieses Verhalten in meinem gesamten django-Projekt passiert. Andernfalls könnte ich es einfach in einen Teil des Skripts einbinden, in dem dieses Verhalten passieren soll.

Erheben Sie MySQL Warnungen als Fehler:

%Vor%

Um zu ignorieren, anstatt einen Fehler zu erzeugen, ersetzen Sie "error" durch "ignore" .

Behandle sie in einem try-except-Block wie:

%Vor%     
Syed Rakib Al Hasan 28.03.2016 21:25
quelle

Tags und Links