Du kan ikke tilføje en kolonne til din tabel med data i det hele i ét trin. Du skal bruge mindst to separate sætninger for at udføre DDL først (ALTER TABLE ) og DML-sekundet (UPDATE eller INSERT ... ON DUPLICATE KEY UPDATE ).
Det betyder, at for at tilføje en kolonne med en NOT NULL begrænsning kræver tre trin:
- Tilføj nullbar kolonne
- Udfyld kolonne med værdier i hver række
- Tilføj
NOT NULLbegrænsning til kolonnen
Alternativt, ved at bruge en "dummy"-standardværdi, kan du gøre det i to trin (bare pas på ikke at lade nogen "dummy"-værdier svæve rundt, eller brug værdier, der er meningsfulde/veldokumenterede):
- Tilføj kolonne som
NOT NULL DEFAULT ''(eller brug f.eks.0for numeriske typer) - Udfyld kolonne med værdier i hver række
Du kan valgfrit ændre tabellen igen for at fjerne DEFAULT værdi. Personligt foretrækker jeg den første metode, fordi den ikke introducerer meningsløse værdier i din tabel, og det er mere sandsynligt, at der kommer en fejl, hvis det andet trin har et problem. Jeg måske gå med den anden metode, når en kolonne egner sig til en bestemt naturlig DEFAULT værdi, og jeg planlægger at beholde det i definitionen af sluttabellen.
Derudover parametrerer du ikke din forespørgsel korrekt; du bør give parameterværdierne til metoden i stedet for at formatere strengargumentet inde i metodekaldet. Med andre ord:
cursor.execute("Query with %s, %s, ...", iterable_with_values) # Do this!
cursor.execute("Query with %s, %s, ..." % iterable_with_values) # NOT this!