Non puoi aggiungere una colonna alla tabella con tutti i dati in un solo passaggio. È necessario utilizzare almeno due istruzioni separate per eseguire prima il DDL (ALTER TABLE
) e il secondo DML (UPDATE
o INSERT ... ON DUPLICATE KEY UPDATE
).
Ciò significa che per aggiungere una colonna con un NOT NULL
il vincolo richiede tre passaggi:
- Aggiungi colonna nullable
- Popolare la colonna con i valori in ogni riga
- Aggiungi il
NOT NULL
vincolo alla colonna
In alternativa, utilizzando un valore predefinito "fittizio", puoi farlo in due passaggi (fai solo attenzione a non lasciare valori "fittizi" fluttuanti o usa valori significativi/ben documentati):
- Aggiungi colonna come
NOT NULL DEFAULT ''
(o usa ad es.0
per i tipi numerici) - Popolare la colonna con i valori in ogni riga
Puoi opzionalmente modificare di nuovo la tabella per rimuovere il DEFAULT
valore. Personalmente, preferisco il primo metodo perché non introduce valori privi di significato nella tabella ed è più probabile che generi un errore se il secondo passaggio presenta un problema. potrei vai con il secondo metodo quando una colonna si presta a un certo DEFAULT
naturale valore e ho intenzione di mantenerlo nella definizione del tavolo finale.
Inoltre, non stai parametrizzando correttamente la tua query; dovresti passare i valori dei parametri al metodo anziché formattare l'argomento stringa all'interno della chiamata al metodo. In altre parole:
cursor.execute("Query with %s, %s, ...", iterable_with_values) # Do this!
cursor.execute("Query with %s, %s, ..." % iterable_with_values) # NOT this!