Alambic: IntegrityError: “colonne contient des valeurs null” lors de l'ajout de colonne non nullable
Je vais ajouter une colonne à une table existante. Cette nouvelle colonne est nullable=False
.
op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False))
Quand je lance la migration, il se plaint:
sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
Vous devez vous connecter pour publier un commentaire.
C'est parce que vos données n'ont aucune valeur sur cette nouvelle colonne, c'est à dire
null
. Ainsi causant cette erreur. Lors de l'ajout d'une colonne non nullable, vous devez décider quelle valeur donner à déjà existants, les donnéesBien, les données existantes venons de "lorem ipsum" pour cette nouvelle colonne. Mais comment dois-je faire? Je ne peux pas mettre à JOUR parce que la colonne n'est pas encore là.
Utiliser le
server_default
arg:Mais, mais, je ne veux pas qu'il ont une valeur par défaut
Déposez ensuite, en utilisant les
op.alter_column('mytable', 'mycolumn', server_default=None)
E. g. votre
upgrade()
fonction serait:'True'
et'False'
au lieu deTrue
etFalse
op.add_column( "project", sa.Column("tenant_id", sa.Integer(), nullable=False, server_default="1"), )
pour le faire fonctionner (mon id sont des entiers)Une alternative à @Ron réponse est de faire le contraire, et de modifier les données avant l'ajout de la contrainte:
Semble plus propre et plus puissant pour moi, mais vous êtes en train de rédiger SQL :-).
Il vous dit - à juste titre - qu'il y a (ou aura) des valeurs NULL dans la base de données pour cette colonne. La réponse est d'éditer le fichier de migration de mettre à jour la colonne avant de changer la définition de la colonne: