Você não pode adicionar uma coluna à sua tabela com dados em uma única etapa. Você deve usar pelo menos duas instruções separadas para executar o DDL primeiro (
ALTER TABLE
) e o segundo DML (UPDATE
ou INSERT ... ON DUPLICATE KEY UPDATE
). Isso significa que para adicionar uma coluna com um
NOT NULL
restrição requer três etapas:- Adicionar coluna anulável
- Preencha a coluna com valores em cada linha
- Adicione o
NOT NULL
restrição à coluna
Alternativamente, usando um valor padrão "fictício", você pode fazer isso em duas etapas (apenas tome cuidado para não deixar nenhum valor "fictício" flutuando ou use valores significativos/bem documentados):
- Adicionar coluna como
NOT NULL DEFAULT ''
(ou use, por exemplo,0
para tipos numéricos) - Preencha a coluna com valores em cada linha
Você pode, opcionalmente, alterar a tabela novamente para remover o
DEFAULT
valor. Pessoalmente, prefiro o primeiro método porque ele não introduz valores sem sentido em sua tabela e é mais provável que gere um erro se a segunda etapa tiver um problema. Eu poderia vá com o segundo método quando uma coluna se presta a um certo DEFAULT
natural value e pretendo manter isso na definição da tabela final. Além disso, você não está parametrizando sua consulta corretamente; você deve passar os valores dos parâmetros para o método em vez de formatar o argumento string dentro da chamada do método. Em outras palavras:
cursor.execute("Query with %s, %s, ...", iterable_with_values) # Do this!
cursor.execute("Query with %s, %s, ..." % iterable_with_values) # NOT this!