Fehler in json Eintrag

Django, Flask, Bottle, WSGI, CGI…
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

sparrow hat geschrieben: Sonntag 25. Juni 2023, 21:05 Dann enthält einer der Datensätze wahrscheinlich kein gültiges JSON.
Das kann man hier erkennen?
sparrow hat geschrieben: Sonntag 25. Juni 2023, 21:05 Warum tritt der Fehler auf, obwohl du das Feld in der Migration nicht verändert wird?
??
sparrow hat geschrieben: Sonntag 25. Juni 2023, 21:05 Für bestimmte Operationen, die das Schema einer Tabelle verändern, muss eine Kopie der Tabelle erstellt und die alten Daten eingespielt werden. Und genau das geht hier schief. Die neue Tabelle wird mit der neuen Struktur erstellt. Dann werden die alten Daten übernommen und mindestens ein Datensatz sorgt für den IntegrityError.
__blackjack__ hat geschrieben: Sonntag 25. Juni 2023, 21:06 @Pitwheazle: Na dann mal alles selektieren was kein gültiges JSON ist.
Entschuldigt Leute - ich verstehe nur Bahnhof. Habt ihr eine Anleitung für Dummies?
Benutzeravatar
grubenfox
User
Beiträge: 447
Registriert: Freitag 2. Dezember 2022, 15:49

Pitwheazle hat geschrieben: Sonntag 25. Juni 2023, 21:25
sparrow hat geschrieben: Sonntag 25. Juni 2023, 21:05 Dann enthält einer der Datensätze wahrscheinlich kein gültiges JSON.
Das kann man hier erkennen?
Das sagt die Fehlermeldung.

Code: Alles auswählen

JSON_VALID("loesung") OR "loesung" IS NULL

Die Alternative, dass in einen Datensatz das Feld "loesung" NULL enthält, haben wir ja schon ausgeschlossen. Damit bleibt ja nur

Code: Alles auswählen

JSON_VALID("loesung")
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

grubenfox hat geschrieben: Sonntag 25. Juni 2023, 22:31
Pitwheazle hat geschrieben: Sonntag 25. Juni 2023, 21:25
sparrow hat geschrieben: Sonntag 25. Juni 2023, 21:05 Dann enthält einer der Datensätze wahrscheinlich kein gültiges JSON.
Das kann man hier erkennen?
[/code]
Meine Frage bezog sich auf den gezeigten Screenshot. Was kann man aus dem erkennen (ich erkenne da nichts - wer hätte es gedacht!)
grubenfox hat geschrieben: Sonntag 25. Juni 2023, 22:31 Das sagt die Fehlermeldung.

Code: Alles auswählen

JSON_VALID("loesung") OR "loesung" IS NULL
Dazu müsste
grubenfox hat geschrieben: Sonntag 25. Juni 2023, 22:31

Code: Alles auswählen

JSON_VALID("loesung")
Was bedeutet das für mich? (Bitte geht doch davon aus, dass ich keine Ahnung habe)
Heißt das, dass nicht ein NULL Eintrag in "loesung" das Problem ist, sondern irgendwo ein Eintrag der nicht JSON Konform ist?

... Jetzt gehe ich aber erstmal schlafen - gute Nacht allen miteinander und wieder mal vielen Dank!
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

@Pitwheazle: Ich weiß nicht, auf was sich dein Zitat mit dem Screenshot bezieht. Das lässt sich am Handy nicht so toll nachvollziehen.

Es ist nicht hilfreich, wenn du aus einem Zusammenhängenden Textblock den ersten Satz zitierst, mit einem "??" antwortest, und danach den Zeil des Textblocks, der eben diese erste Frage beantwortet. Deshalb habe ich den ja so geschrieben. Der macht natürlich nur zusammen Sinn. Er erklärt dein "Ich sehe da keinen Zusammenhang zu dem Feld `loesung` in der Migration".

Was wissen wir?
Die Migration löst _innerhalb der Datenbank, gänzlich losgelöst von der Anwendung_ ein Problem aus, weil Daten gegen die Bedingung des Feldes verstoßen.

Was sind die Bedingungen des Feldes?
Der Wert darf nicht NULL sein und das Feld muss gültiges JSON sein.

Wir haben ausgeschlossen, dass in einem Feld NULL steht. Also bleibt nur noch übrig, dass ein Feld ungültiges JSON enthält.

Am Ende wirst du dich mit Datenbanken und SQL beschäftigen müssen. Auch wenn das Django ORM das abstrahiert zwar vieles, das Verständnis dafür, was da im Hintergrund passiert macht das aber nicht entbehrlich.

Code: Alles auswählen

SELECT * FROM core_protokoll WHERE JSON_VALID(loesung) <> 0
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

@sparrow: Zunächst muss ich mich mal wieder bei dir und auch bei @__blackjack__ und @grubenfox für eure unendliche Geduld bedanken. Nach jedem Posting meinerseits in der ich mich wieder dusselig anstelle, habe ich Angst, dass ihr mir jetzt nicht mehr helfen könnt und mich in Verzweiflung zurücklasst.
Also Dank deiner Hilfe bin ich wieder etwas weiter - oder auch nicht?
Zunächst zu deinen Anmerkungen:
Das mit dem Screenshot war so, dass ich mich gewundert habe, dass du aus diesem Screenshot hier unten schließen konntest, dass ein Datensatz kein gültiges JSON enthält. Zwischenzeitlich habe ich es kappiert: Da kein Datensatz NULL ist, muss eines ungültig sein (siehe weiter unten)
Bild
Das mit den ?? bezog sich darauf, dass ich die Formulierung nicht verstanden habe:Bild
Was meintest du damit? "Warum tritt der Fehler auf, obwohl nichts geändert wurde/ich nichts geändert habe?

Und mit etwas rumprobieren habe ich in dem DB Browser deinen Code ausführen können (ich dachte, das hätte beim letzten Versuch nicht geklappt, da nichts angezeigt wurde (und hatte wie immer keine Ahnung was ich da mache)) - jetzt wurde aber was angezeigt und zwar alles:
Bild
... das heißt jetzt: kein Eintrag in "loesung" ist NULL und keines ist ungültig? (insgesamt sind es 20145 Objekte).
Und nun?
Du sagst, ich müsse mich mit der Struktur beschäftigen - hilf mir da doch bitte mal:
Wenn ich in meinen models eine Änderung vornehme, wird mittel "makemigrations" eine neue Datenbankstruktur erstellt und in "migrations.py" ein entsprechender Eintrag erzeugt (oder auch umgekehrt). Wenn ich dann "migrate" ausführe, wird in der bestehenden Datenbank in allen Objekten diese Änderung angewandt und falls da was nicht klappt, bekomme ich eine Fehlermeldung. Ist das soweit richtig?
ich habe jetzt mal die Datei "migrate.py" aus meinem Rechentrainer im Internet heruntergeladen und festgestellt, dass dort nur die Migrations bis 0091 identisch sind:
Bild
kann ich die in migrations ab 0092 lokal einfach mal löschen und ausprobieren, ob "migrate" dann funktioniert? Ich sehe den Zusammenhang mit "loesung" nicht.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

Nachtrag: Da der Fehler ja anscheinend im Zusammenhang mit meinem model "sachaufgabe" auftaucht, habe ich dieses mal aufgemacht - da gibt es auch ein Feld "loesung" - das ist aber ein Textfeld. Kann da ein Zusammenhang bestehen?

Code: Alles auswählen

class Sachaufgabe(models.Model):
    lfd_nr = models.SmallIntegerField(default=0, unique=True)
    ab_jg = models.SmallIntegerField(default=0)
    text = models.TextField()
    variable = models.JSONField(help_text="z.B.:{'a': [5, 5.5, 6, 6.5, 7], 'b': [[2, 'zwei'], [4, 'vier']]}")
    loesung = models.CharField(max_length=50, help_text="z.B.: {c}*{a:.2f}+{d}*{b:.2f}={:.2f}")
    pro_text = models.CharField(max_length=25)
    anmerkung = models.CharField(max_length=50, null=True, blank=True)
    links_text = models.CharField(max_length=25)
    rechts_text = models.CharField(max_length=25)
    def __str__(self):       
        return f"{self.lfd_nr}: {self.text}, {self.ab_jg}"
    class Meta:
        verbose_name_plural = 'Sachaufgaben'
Benutzeravatar
__blackjack__
User
Beiträge: 13241
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Du hast 20145 Treffer aber vorher in zwei Beispielen gesagt es gibt 20158 Datensätze. Es wäre vielleicht sinnvoller sich die *ungültigen* Datensätze anzeigen zu lassen, statt der wo alles Ok ist.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

Als ich das gepostet habe, waren es 20158 Datensätze im Internet, als ich die Datenbank runtergeladen habe, waren es erst 20145. So viel werden mir auch angezeigt wenn ich keinen Filter setze.
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

@Pitwheazle: Dann würde ich mit mal die Tabelle sachaufgabe anschauen, wie das Feld da aussieht.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

So:
Bild
aber, wie gesagt, hier ist das Feld "loesung" ein Textfeld. Ich habe aber beim Erstellen dieser Aufgabenkategorie öfter mal was im model ergänzt und wieder gelöscht. Daher habe ich oben gefragt, ob man die Einträge in "migrate.py" einfach löschen (und dann neu erstellen) kann.
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

Erstens geht aus dem Screenshot nicht hervor, welche Spalte welches Feld ist.

Zweitens geht es um die Definition des Feldes im Schema der Tabelle. Ich wunder mich nämlich woher du did Gewissheit nimmst, dass das ein Textfeld ohne constraints ist.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

sparrow hat geschrieben: Montag 26. Juni 2023, 18:43 Erstens geht aus dem Screenshot nicht hervor, welche Spalte welches Feld ist.
Uups, falsch beschnitten:
Bild
sparrow hat geschrieben: Montag 26. Juni 2023, 18:43 Zweitens geht es um die Definition des Feldes im Schema der Tabelle. Ich wunder mich nämlich woher du did Gewissheit nimmst, dass das ein Textfeld ohne constraints ist.
Ich hatte hier obendrüber den Code meines models schon eingestellt. Erkläre mir doch bitte, wie man feststellt, wie man das mit "constraint" überprüft?
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

Es geht ja aber nicht um dein Model.
Der Fehler wird ja nicht irgendwo in deinem Code ausgelöst sondern in der Datenbank.
Also musst du auch in der Datenbank schauen, wie das Feld _dort_ angelegt ist. Das hast du doch für die andere Tabelle auch schon gemacht. Im Schema der Tabelle steht, was für ein Typ Feld mit welchen Constraints (in SQLite CHECK) das ist.
Benutzeravatar
__blackjack__
User
Beiträge: 13241
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Gibt es das Problem denn eigentlich überhaupt noch?
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

__blackjack__ hat geschrieben: Montag 26. Juni 2023, 23:47 Gibt es das Problem denn eigentlich überhaupt noch?
Jawohl, das Problem besteht noch.
Ich bin jetzt mal ganz brutal drangegangen, habe eine Kopie von dem Projekt erstellt, habe die migrations ab 0092 gelöscht und mit makekigration die Datenbankstruktur neu erstellt (in der Hoffnung, dass da irgendwas, was ich hinzugefügt und später geändert bzw. gelöscht habe, entfernt wird). Die Fehlermeldung blieb die gleiche.
Dann habe ich 0092 nochmals gelöscht und die Felder "loesung" in "Protokoll" entfernt und auch die Felder "variable" (ein JSON Field) und "loesung" in "Sachaufgabe" - immer noch die gleiche Fehlermeldung.
Zuletzt habe ich im DB Browser das Feld "loesung" direkt entfernt. Jetzt bekomme ich die Fehlermeldung

Code: Alles auswählen

  Applying core.0092_remove_protokoll_loesung_remove_sachaufgabe_ergebnis_and_more...Traceback (most recent call last):
  File "D:\Dropbox\RechentrainerWeb\rechentrainer_024 - Kopie (4)\django_rechentrainer\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
  File "D:\Dropbox\RechentrainerWeb\rechentrainer_024 - Kopie (4)\django_rechentrainer\lib\site-packages\django\db\backends\sqlite3\base.py", line 357, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such column: "loesung"
Hilfe - was mache ich jetzt?
Benutzeravatar
__blackjack__
User
Beiträge: 13241
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich würde ja mal schauen welche Datensätze in der Spalte Lösung kein gültiges JSON sind. Direkt. Nicht indirekt in dem man schaut welche gültig sind, und Datensatzzahlen manuell/im Kopf vergleicht.

Ansonsten wäre es interessant was die betroffene Migration macht, eventuell auch alles bis da hin. Vielleicht versucht ja die Migration aus irgendwelchen Gründen ungültiges JSON da einzufügen.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

__blackjack__ hat geschrieben: Dienstag 27. Juni 2023, 12:44 Ich würde ja mal schauen welche Datensätze in der Spalte Lösung kein gültiges JSON sind. Direkt. Nicht indirekt in dem man schaut welche gültig sind, und Datensatzzahlen manuell/im Kopf vergleicht.
Prima, auf die Idee war ich jetzt auch gekommen. Einen sql-Befehl zum Aufspüren ungültiger JSON habe ich nicht gefunden. Aber, wie du empfohlen hast, durch Inaugenscheinnahme:
Bild
Ich hoffe, damit das Problem lösen zu können. Ich gehe davon aus, dass die fehlenden Klammern hier das Problem sind.
Ich werde also in meinem Code nach dem Fehler suchen (der scheint nur bei einer Aufgabenkategorie aufzutreten).
Wie bekomme ich diese Einträge aber verbessert?
Im sql Browser oder per Python-code?
Im sql Browser müsste ich ja nur die Einträge in "loesung" sortieren und bekäme alle ohne Klammer am Anfang angezeigt. Ich habe aber keine Ahnung, wie ich die Einträge sortiert angezeigt bekomme.
Mittels Code müsste ich die Daten doch auch ändern können.
Benutzeravatar
Kebap
User
Beiträge: 696
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Der Datenbank ist ja erstmal egal, ob der Text darin gültiges JSON ist. Im Zweifel kennt die gar kein JSON. Die gibt nur den Text aus.
Dein Python Code empfängt den Text aus der Datenbank und versucht, den als JSON zu interpretieren und in Python Objekte umzuwandeln.
Ich bin nicht sicher, ob dein Code dabei irgendwie besonders gnädig mit dem JSON umgeht, so dass es zu keinen Problemen bisher kam.

Unklar ist auch, wer dort überhaupt ursprünglich den Text eingefügt hatte, der dann später nicht als JSON zu interpretieren ist.
Vielleicht brauchst du also auch noch Anpassungen an (Teilen von) dem Python Code, der die Texte in die Datenbank schreibt.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

@Kebap: Der Datenbank ist das nicht unbedingt egal. Der Fehler der Migration wird von der Datenbank geworfen.
Antworten