Ответ 1
[ALTER TABLE... ALTER COLUMN...]
Необязательное предложениеUSING
указывает, как вычислить новое значение столбца из старого; если опустить, преобразование по умолчанию такое же, как присваивание от старого типа данных к новому. ПредложениеUSING
должно быть предоставлено, если нет неявного или присваиваемого приведения от старого к новому типу.
В PostgreSQL нет неявного преобразования от varchar
до int
, поэтому он жалуется, что column "number" cannot be cast to type integer
и ALTER TABLE не работают. Вы должны сообщить PostgreSQL, как преобразовать старые строки в числа, чтобы они соответствовали новому типу столбцов, а это значит, что вам нужно получить предложение USING в свой ALTER TABLE. Я не знаю, как сделать Rails для этого, но вы можете сделать это вручную достаточно легко:
def up
connection.execute(%q{
alter table tweets
alter column number
type integer using cast(number as integer)
})
end
Вы хотите следить за значениями, которые нельзя отличить от целых чисел, PostgreSQL сообщит вам, есть ли проблемы, и вам придется исправить их до того, как миграция будет успешной.
Ваша текущая миграция должна быть прекрасной, преобразование integer
в varchar
должно выполняться автоматически.