2009-06-09 8 views
1

J'essaie d'exécuter une migration sur une base de données existante pour modifier le nom de la colonne sur une table. Lorsque j'exécute la migration, j'obtiens une erreur indiquant que les champs Blob/Text ne peuvent pas avoir une valeur par défaut. La colonne en question est une colonne de texte, avec un attribut non nul, mais pas de valeur par défaut.Rails rename_column migration issue

La migration que Rails tentatives est:

ALTER TABLE xxxxx CHANGEMENT abcdABCD texte DEFAULT '' NOT NULL

Maintenant, je ne l'ai pas demandé la migration de changer le type de colonne, je n'ai demandé Pour renommer la colonne, pourquoi la migration tente-t-elle de faire quoi que ce soit au type de colonne?

J'ai recherché le problème et je n'ai pas trouvé d'explication ou de solution de contournement.

Toute aide appréciée.

Vikram

Répondre

0

Il ne semble être un billet non résolu depuis longtemps sur cette question, comme décrit ici:

rails bug report

comportement par défaut Rails est de faire des colonnes qui sont NULL, car cela empêche faux positifs sur les contrôles de présence, etc, lors de la traduction des chaînes vierges en Ruby. Avez-vous une chance de contourner ce problème en redéfinissant votre colonne de texte pour travailler avec des valeurs NULL dans la console mySQL?

EDIT

Vous pouvez le faire dans votre fichier de migration, ce n'est pas la Rails façon, mais il est beaucoup plus agréable que d'envoyer un e-mail à tout le monde à changer leurs copies locales:

MyModel.connection.execute "ALTER TABLE xxxxx CHANGE abcd ABCD text DEFAULT NULL" 
+0

Arrghh la douleur! J'essayais de faire la bonne chose en ne sortant PAS de la Migration des Rails et en documentant tout correctement pour que d'autres puissent suivre, et je pouvais simplement lancer rake db: migrate. Cela met dans une étape supplémentaire externe à Rails. Merci d'avoir signalé le rapport de bug. Je ne suis pas sûr pourquoi je ne l'ai pas trouvé. –

+0

Merci, oui, en utilisant l'exécution pour faire une mise à jour manuelle est beaucoup mieux que les mises à jour externes. –