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 NULL
begræ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.0
for 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!