每当我尝试更改数据库列类型时,Heroku出错

时间:2018-04-29 15:04:59

标签: ruby-on-rails database heroku

我在数据库中更改了一个列,如下所示:

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

它在我的本地计算机上运行正常,但每当我尝试通过heroku run rake db:migrate在Heroku上运行此迁移时,我收到以下错误:

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 :(得分:2)

您的错误消息来自PostgreSQL,但您正在使用MySQL进行开发。

在开发和生产(以及测试,登台和您可能拥有的任何其他环境)中使用相同的数据库技术是一个非常的好主意。当您从一个环境移动到另一个环境时,这将最大限度地减少意外,例如:当您将代码部署到Heroku时。

我建议采取以下两种行动之一:

  • 在开发计算机上切换到PostgreSQL。

    这可能会导致您的迁移在本地失败,但这是一件好事!现在,您可以对开发中的错误进行故障排除和修复,这比处理生产中弹出的问题要好得多。

    在这种情况下,问题与您price列的当前类型相关联。 PostgreSQL无法将该数据类型自行转换为浮点数needs some help from you

  • 在Heroku上切换到MySQL。

    Heroku使用开箱即用的PostgreSQL,但它也支持many other data stores。选择一个MySQL提供程序并使用它而不是PostgreSQL。

在这两种情况下,请尝试匹配数据库提供程序的版本号。

其中任何一个都可以使用,但我的首选项将是第一个选项。对于我喜欢的数据类型,MySQL有点太快和松散。如果您选择使用MySQL,请在本地运行迁移之前和之后仔细查看您的数据,以确保它正在做“正确的事情”。

编辑:看起来您实际上是在本地计算机上使用SQLite。由于ephemeral filesystem,这对Heroku不起作用。您必须在Heroku上使用客户端 - 服务器数据库,我强烈建议您在本地开发计算机上使用相同的数据库。

答案 1 :(得分:1)

我相信如果您想要更改该列类型,Postgres希望您告诉它如何处理列中当前的任何值。提示指向您:

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

如果Postgres的Rails适配器不喜欢'float',则可能需要更改为该类型的措辞。

答案 2 :(得分:0)

如果您正处于开发环境中,我会删除该列:

remove_column :products, :price

再次添加:

add_column :products, :price, :float

然后运行迁移应该没有任何问题

除非你有数据,否则你将不得不改变使用表达式