6

これはかなり簡単に思えますが、何が間違っているのかわかりません。

Railsの移行で次のことをしようとしています:

change_column :foo, :bar, :text, :limit => 16777215

次のエラーが表示されます

Mysql::Error: BLOB/TEXT column 'bar' can't have a default value: ALTER TABLE `foo` CHANGE `bar` `email_contents` text(16777215) DEFAULT '' NOT NULL

私が把握できる唯一の問題は、列を foo に追加した直後にこの change_column が発生し、最初にタイプ :string からタイプ :text に変更しなければならなかったことです。これらはそれぞれ独自の移行スクリプトに由来し、次のようになります。

add_column :foo, :bar, :string, :null => false

change_column :foo, :bar, :text

実験として、最初の change_column (change_column :foo, :bar, :text) を変更してみましたが、これによりテーブルが正常に変更されることがわかりました。残念ながら、以前の移行を変更することはできず、現在の実装では新しい移行しか追加できないため、本番環境では機能しません。問題は、列を 1 回変更できるのに 2 回変更できないのはなぜですか?

更新最初の提案を試しましたが、次の結果が得られました。

Mysql::Error: BLOB/TEXT column 'bar' can't have a default value: ALTER TABLE `foo` CHANGE `bar` `bar` text(16777215) DEFAULT ''
4

6 に答える 6

12

試す

change_column :foo, :bar, :text, :limit => 16777215, :default => nil, :null => true

于 2011-05-09T20:32:04.600 に答える
3

誰かがこの投稿に出くわし、これが役に立つと思った場合に備えて。回避するもう1つの方法は、sql-modeが厳密にならないように、つまりSTRICT_TRANS_TABLESデフォルトで含まれていないようにmysql構成を変更することです。

于 2012-05-16T19:58:01.107 に答える
1

私にとって、これは MySQL 5.5.x から 5.6.x に移行した結果のようです。

注: 誰かがSemantic Versioning 2.0.0を読んでください。

私の修正は非常に簡単でした...

だった

change_column :my_table, :my_column, :mediumtext #=> Migrations Explosion

change_column :my_table, :my_column, :mediumtext, default: nil #=> All good in the mysql 5.6.21 
于 2015-02-10T19:30:14.867 に答える
1

その作業で a:limitが指定されている他の移行はありますか?:text

:textを受け入れない可能性があり:limit、これを正しく読めば、単に特定の MySQL データ型にマップされます。

Rails 移行タイプと MySQL データ タイプのマップ: http://www.orthogonalthought.com/blog/index.php/2007/06/mysql-and-ruby-on-rails-datatypes/

MySQL TEXT タイプ (LIMIT については言及されていませんが、それを除外しているとは思いません: http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

于 2011-05-09T20:35:40.900 に答える
0

これは私のために働いた:

    change_column :delayed_jobs, :handler, :text, 
      limit: 16777215, null: true, default: nil

追加する必要がdefault: nilあり、Rails は OK 設定でしたnull: true。これにより、以前の移行で定義されたデフォルトが削除されます。

于 2014-11-04T23:04:16.433 に答える
0

これを試して:

change_column :foo, :bar, :text, :limit => 16777215, :null => true

を使用する:null => falseと (古い移行のように)、Rails は DEFAULT ビットを ALTER TABLE ステートメントに追加します。ただし、エラーが示すように、TEXT 列に DEFAULT を指定することはできません。:null => true新しい移行でそれを変更することで、問題は解決するはずです。

于 2011-05-09T19:40:28.447 に答える