Ответ 1
change_column :table_name, :product_code,
'integer USING CAST(product_code AS integer)'
Здесь есть хороший вопрос . Я хочу подробно остановиться. Я пытаюсь преобразовать столбец в моей базе данных из строки в целое число.
Я думал, что конвертация будет довольно прямой forwrad. В настоящее время мои строки
["10", "12", "125", "135", "140", ...]
Мой файл миграции включает в себя:
def change
change_column :table_name, :product_code, :integer
end
Rails пытается это, но Postgresql возвращает ошибку.
PG:: Ошибка: ERROR: столбец "product_code" не может быть автоматически запущен для ввода целого числа СОВЕТ. Укажите выражение USING для выполнения преобразования.
Я не уверен, как использовать это выражение "ИСПОЛЬЗОВАНИЕ" в моей миграции рельсов.
Итак, я думал, что преобразование будет довольно прямолинейным. Что следует использовать в качестве выражения USING?
change_column :table_name, :product_code,
'integer USING CAST(product_code AS integer)'
Скорректированный код для поддержки преобразования пустых строк:
change_column :table_name, :product_code,
"integer USING NULLIF(product_code, '')::int"
Пустая строка становится NULL
, которая становится 0
при преобразовании типов, что, вероятно, лучше всего в этой ситуации.
Когда вы пишете Rails-миграции для преобразования столбца строки в целое число, которое вы обычно пишете так:
change_column :table_name, :column_name, :integer
Вы можете получить следующее:
PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer
HINT: Specify a USING expression to perform the conversion.
"Подсказка" в основном говорит вам, что вам нужно подтвердить, что вы хотите, чтобы это произошло, и как данные должны быть преобразованы. Просто скажите это в своей миграции:
change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'