Ошибка в Heroku при попытке изменить тип столбца базы данных - PullRequest
0 голосов
/ 29 апреля 2018

Я изменил столбец в моей базе данных следующим образом:

class ChangePriceToBeFloatInProducts < ActiveRecord::Migration[5.1]
  def change
      change_column :products, :price, :float
  end
end

Он отлично работает на моей локальной машине, но всякий раз, когда я пытаюсь запустить эту миграцию на Heroku через heroku run rake db:migrate, я получаю следующую ошибку:

StandardError: An error has occurred, this and all later migrations canceled:

    PG::DatatypeMismatch: ERROR:  column "price" cannot be cast automatically to type double precision
    HINT:  You might need to specify "USING price::double precision".
    : ALTER TABLE "products" ALTER COLUMN "price" TYPE float

Я уже пытался сбросить базу данных, но я все еще получаю ту же ошибку.

Как я могу это исправить?

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Ваше сообщение об ошибке исходит от PostgreSQL, но вы разрабатываете с использованием MySQL.

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

Я рекомендую один из следующих двух вариантов действий:

  • Переключитесь на PostgreSQL на своей машине разработки.

    Это, вероятно, приведет к локальному сбою миграции, но это хорошо! Теперь вы можете устранять и устранять ошибки в разработке, что гораздо лучше, чем устранять проблемы, возникающие в работе.

    В этом случае проблема связана с текущим типом столбца price. PostgreSQL не может конвертировать этот тип данных в число с плавающей точкой, и нужна ваша помощь .

  • Переключиться на MySQL на Heroku.

    Heroku использует PostgreSQL из коробки, но также поддерживает многие другие хранилища данных . Выберите одного из поставщиков MySQL и используйте его вместо PostgreSQL.

В обоих случаях попробуйте сопоставить номер версии поставщика базы данных.

Любой из них будет работать, но мой предпочтение strong будет первым вариантом. MySQL слишком быстр и свободен с типами данных на мой взгляд. Если вы решите использовать MySQL, внимательно посмотрите на свои данные до и после локального запуска миграции, чтобы убедиться, что она работает «правильно».

Редактировать: Похоже, вы на самом деле используете SQLite на локальном компьютере. Это не сработает на Heroku из-за его эфемерной файловой системы . Вам придется использовать базу данных клиент-сервер в Heroku, и я настоятельно рекомендую использовать ту же базу данных на локальном компьютере для разработки.

0 голосов
/ 30 апреля 2018

Если вы находитесь в среде разработки, я бы опустил столбец:

remove_column :products, :price

И добавляем его снова:

add_column :products, :price, :float

Тогда выполнение миграции должно пройти без проблем

Если у вас нет данных, вы должны будете изменить выражения

0 голосов
/ 29 апреля 2018

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

change_column :products, :price, 'float USING CAST(price AS float)'

Если адаптеру Rails для Postgres не нравится 'float', возможно, вам придется перейти к формулировке типа.

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