Ошибка миграции Rails - PullRequest
6 голосов
/ 09 мая 2011

Это кажется довольно простым, но я не уверен, что происходит не так.

Я пытаюсь сделать следующее в моей миграции на 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

Единственное, что я могу понять, это проблема: то, что этот change_column возникает вскоре после того, как я добавил столбец в foo и мне пришлось изменить его с type: string на type: textна первом месте.Каждый из них имеет свои собственные сценарии миграции и выглядит так:

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

и

change_column :foo, :bar, :text

В качестве эксперимента я попытался изменить первый столбец change_column (change_column: foo,: bar,: text) и обнаружил, что это успешно меняет таблицу.К сожалению, я не могу изменить ни одну из предыдущих миграций и могу только добавить новые в нашу текущую реализацию, чтобы она не работала в производстве.Вопрос в том, что позволяет мне изменить столбец один раз, но не дважды?

Обновление Попробовал первое предложение, но получил следующее:

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

Ответы [ 6 ]

12 голосов
/ 10 мая 2011

попробуй

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

3 голосов
/ 16 мая 2012

В случае, если кто-то сталкивается с этим сообщением и находит это полезным. У меня была такая же проблема, другой способ избежать ее - это изменить конфигурацию mysql, чтобы sql-mode не был строгим, то есть не включал STRICT_TRANS_TABLES, что по умолчанию.

1 голос
/ 10 февраля 2015

Для меня это, кажется, результат перехода с MySQL 5.5.x на 5.6.x

Примечание.*

Мое исправление было довольно простым ...

БЫЛ

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

IS

change_column :my_table, :my_column, :mediumtext, default: nil #=> All good in the mysql 5.6.21 
1 голос
/ 10 мая 2011

Есть ли у вас другие миграции, где :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

0 голосов
/ 05 ноября 2014

Это сработало для меня:

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

Мне пришлось добавить default: nil, а затем Rails был в порядке, установив null: true, что удаляет значение по умолчанию, определенное в более ранней миграции.

0 голосов
/ 09 мая 2011

Попробуйте это:

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

Когда используется :null => false (как в старой миграции), Rails добавляет бит DEFAULT в инструкцию ALTER TABLE. Но, как говорится в ошибке, столбцы TEXT не могут иметь DEFAULT. Если в новой миграции изменить его на :null => true, проблема должна исчезнуть.

...