Vous ne pouvez pas ajouter une colonne à votre table avec des données en une seule étape. Vous devez utiliser au moins deux instructions distinctes pour effectuer d'abord le DDL (ALTER TABLE
) et la seconde DML (UPDATE
ou INSERT ... ON DUPLICATE KEY UPDATE
).
Cela signifie que pour ajouter une colonne avec un NOT NULL
contrainte nécessite trois étapes :
- Ajouter une colonne nullable
- Remplir la colonne avec des valeurs dans chaque ligne
- Ajouter le
NOT NULL
contrainte à la colonne
Alternativement, en utilisant une valeur par défaut "fictive", vous pouvez le faire en deux étapes (faites juste attention à ne pas laisser de valeurs "fictives" flottantes, ou utilisez des valeurs significatives/bien documentées) :
- Ajouter une colonne en tant que
NOT NULL DEFAULT ''
(ou utilisez par exemple0
pour les types numériques) - Remplir la colonne avec des valeurs dans chaque ligne
Vous pouvez éventuellement modifier à nouveau la table pour supprimer le DEFAULT
évaluer. Personnellement, je préfère la première méthode car elle n'introduit pas de valeurs sans signification dans votre table et il est plus susceptible de générer une erreur si la deuxième étape a un problème. Je pourrais optez pour la deuxième méthode lorsqu'une colonne se prête à un certain DEFAULT
naturel valeur et je prévois de la conserver dans la définition de la table finale.
De plus, vous ne paramétrez pas correctement votre requête ; vous devez passer les valeurs des paramètres à la méthode plutôt que de formater l'argument de chaîne à l'intérieur de l'appel de méthode. En d'autres termes :
cursor.execute("Query with %s, %s, ...", iterable_with_values) # Do this!
cursor.execute("Query with %s, %s, ..." % iterable_with_values) # NOT this!