Попытка преобразовать существующие столбцы таблицы производственной базы данных из enum в VARCHAR - PullRequest
1 голос
/ 05 мая 2010

У меня есть проблема, которая требует от меня преобразования существующего работающего производства (я продублировал схему на моем локальном блоке разработки, не волнуйтесь), типы столбцов таблицы из перечислений в строку.

Справочная информация:

По сути, предыдущий разработчик оставил мою кодовую базу в полном беспорядке: версии миграции крайне устарели, и, очевидно, он никогда не использовал ее после определенного периода времени в разработке, и теперь, когда мне поручено перенести Rails 1.2. 6 приложение до 2.3.5.

Я не могу заставить тесты работать должным образом на 2.3.5, потому что у моих столбцов таблицы есть типы столбцов ENUM, и они преобразуются в :string, :limit => 0 в моем schema.rb, что создает проблему неверного значения по умолчанию при выполнении граблей db:test:prepare, как в случае:

Mysql::Error: Invalid default value for 'own_vehicle': CREATE TABLE `lifestyles` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `member_id` int(11) DEFAULT 0 NOT NULL, `own_vehicle` varchar(0) DEFAULT 'Y' NOT NULL, `hobbies` text, `sports` text, `AStar_activities` text, `how_know_IRC` varchar(100), `IRC_referral` varchar(200), `IRC_others` varchar(100), `IRC_rdrive` varchar(30)) ENGINE=InnoDB

Я подумываю о написании задачи миграции, которая просматривает все таблицы базы данных для столбцов с enum и заменяет ее на VARCHAR, и мне интересно, является ли это правильным способом решения этой проблемы. Или еще лучше, если есть способ исправить это без изменения базы данных, еще лучше!

Я также не уверен, как написать его так, чтобы он перебрал мои таблицы базы данных и заменил все ENUM colum_types на VARCHAR.

Ссылки

1 Ответ

2 голосов
/ 05 марта 2012

Я также искал решение для исправления файла schema.rb для перечислений, так как RoR (версия 3.1.3 на данный момент) называет их строкой с пределом 0.

Похоже, есть плагин / гем для обработки типов перечислений без изменения базы данных. На Rails 1 и 2 подключаемый модуль: http://enum -column.rubyforge.org / На Rails 3 есть драгоценный камень, похожий на этот: https://github.com/electronick/enum_column

После добавления enum_column3 в ваш Gemfile (и запуска обновления пакета) или установки плагина, затем запустите задачу rake db: schema: dump для регенерации файла schema.rb.

Единственный недостаток этого плагина / драгоценного камня, который я вижу, это то, что вы должны изменить код в своем приложении, использующем эти поля (поэтому вы должны найти все), со строк на символы и validates_inclusion_of для validates_columns. Тем не менее, у меня не заняло много времени это сделать с помощью grep и vi.

В качестве альтернативы вы можете сделать, как сказал выше Роберт, и напрямую изменить MySQL, чтобы он соответствовал ожиданиям RoR. Но я лично предпочитаю продолжать использовать типы Enum. (У меня есть фон LAMP.) Обработка enum как varchar с использованием validates_inclusion_of в модели прекрасно работает для всего, что не использует schema.rb. Просто тесты и миграции имеют проблемы.

Или же вы можете продолжить редактирование файла schema.rb вручную, чтобы установить ограничение. (Это то, что мы делали до сих пор, но это раздражает.)

(Думаю, у меня недостаточно точек повторения для добавления комментариев? Ответ Стива раздражает меня. Вы определенно хотите использовать миграции, потому что тогда вы гарантируете, что внесете те же изменения в dev, что и в производстве. Это слишком просто чтобы сделать ошибку даже при копировании-вставке SQL во время развертывания. Поверьте, я знаю это по своему опыту. Плюс миграции - это стандартное место для сохранения изменений. И, возможно, вам придется повторно применять их, если вы восстанавливаете из более старая резервная копия.)

...