Du kan inte lägga till en kolumn i din tabell med data i allt i ett steg. Du måste använda minst två separata satser för att utföra DDL först (ALTER TABLE
) och DML-sekunden (UPDATE
eller INSERT ... ON DUPLICATE KEY UPDATE
).
Detta betyder att för att lägga till en kolumn med en NOT NULL
begränsning kräver tre steg:
- Lägg till nullbar kolumn
- Fyll i kolumn med värden i varje rad
- Lägg till
NOT NULL
begränsning för kolumnen
Alternativt, genom att använda ett "dummy"-standardvärde, kan du göra det i två steg (var bara försiktig så att du inte låter några "dummy"-värden flyta runt, eller använd värden som är meningsfulla/väldokumenterade):
- Lägg till kolumn som
NOT NULL DEFAULT ''
(eller använd t.ex.0
för numeriska typer) - Fyll i kolumn med värden i varje rad
Du kan valfritt ändra tabellen igen för att ta bort DEFAULT
värde. Personligen föredrar jag den första metoden eftersom den inte introducerar meningslösa värden i din tabell och det är mer troligt att det ger ett fel om det andra steget har ett problem. Jag kanske gå med den andra metoden när en kolumn lämpar sig för en viss naturlig DEFAULT
värde och jag planerar att behålla det i sluttabellsdefinitionen.
Dessutom parametriserar du inte din fråga korrekt; du bör överföra parametervärdena till metoden istället för att formatera strängargumentet i metodanropet. Med andra ord:
cursor.execute("Query with %s, %s, ...", iterable_with_values) # Do this!
cursor.execute("Query with %s, %s, ..." % iterable_with_values) # NOT this!