Sie können Ihrer Tabelle nicht in einem Schritt eine Spalte mit Daten hinzufügen. Sie müssen mindestens zwei separate Anweisungen verwenden, um die DDL zuerst auszuführen (ALTER TABLE
) und die zweite DML (UPDATE
oder INSERT ... ON DUPLICATE KEY UPDATE
).
Das bedeutet, eine Spalte mit einem NOT NULL
hinzuzufügen Constraint erfordert drei Schritte:
- Nullable-Spalte hinzufügen
- Spalte in jeder Zeile mit Werten füllen
- Fügen Sie
NOT NULL
hinzu Beschränkung auf die Spalte
Alternativ können Sie dies auch in zwei Schritten tun, indem Sie einen „Dummy“-Standardwert verwenden (achten Sie nur darauf, keine „Dummy“-Werte im Umlauf zu lassen, oder verwenden Sie aussagekräftige/gut dokumentierte Werte):
- Spalte als
NOT NULL DEFAULT ''
hinzufügen (oder verwenden Sie z. B.0
für numerische Typen) - Spalte in jeder Zeile mit Werten füllen
Sie können die Tabelle optional erneut ändern, um den DEFAULT
zu entfernen Wert. Persönlich bevorzuge ich die erste Methode, weil sie keine bedeutungslosen Werte in Ihre Tabelle einfügt und eher einen Fehler auslöst, wenn der zweite Schritt ein Problem hat. Ich vielleicht Verwenden Sie die zweite Methode, wenn sich eine Spalte für einen bestimmten natürlichen DEFAULT
eignet Wert und ich plane, dies in der Final Table-Definition beizubehalten.
Darüber hinaus parametrisieren Sie Ihre Abfrage nicht richtig; Sie sollten die Parameterwerte an die Methode übergeben anstatt das String-Argument innerhalb des Methodenaufrufs zu formatieren. Mit anderen Worten:
cursor.execute("Query with %s, %s, ...", iterable_with_values) # Do this!
cursor.execute("Query with %s, %s, ..." % iterable_with_values) # NOT this!