Rails Migration для преобразования строки в целое число? - PullRequest
27 голосов
/ 21 августа 2010

Можно ли изменить поле, представляющее собой строку, на целое число без очистки уже введенных данных?

Текущая структура БД для рассматриваемой таблицы:

create_table :people do |t|
t.string :company_id

Возможно ли это с помощью миграций?

Я думаю, что, возможно, в миграции перенесите старое поле, создайте новое, которое будет целым числом - но я боюсь, что это очистит все уже введенные данные.

Спасибо

Danny

Ответы [ 3 ]

42 голосов
/ 30 июня 2016

Не бросайте столбец, используйте это

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

«Подсказка», которую вы получили от PostgreSQL, в основном говорит вам, что вам нужно подтвердить, что вы хотите, чтобы это произошло, и как данные должны быть преобразованы. Чтобы подтвердить изменения, используйте блок выше в вашей миграции

33 голосов
/ 21 августа 2010

Не удаляйте столбец, он очистит данные.

Однако вы можете попробовать

change_column :people, :company_id, :integer

, и если все значения в company_id можно преобразовать в integer,все должно быть в порядке.

Если это не так (то есть не все строки могут быть преобразованы по умолчанию), то вы можете сделать это в два этапа: 1) создать новый столбец, затем загрузить company_id там после некоторого преобразования.2) удалите company_id, а затем переименуйте новый столбец.

Вы должны быть осторожны с обоими методами (особенно со вторым) и, возможно, вам следует сначала сделать это с копией базы данных.

29 голосов
/ 26 мая 2017

Другие ответы верны, но вы можете сделать еще один шаг с ключевым словом :using:

change_column :people, :company_id, :integer, using: 'company_id::integer'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...