【问题标题】:Error on Heroku whenever I try to change database column type每当我尝试更改数据库列类型时 Heroku 上的错误
【发布时间】:2018-04-29 15:04:58
【问题描述】:

我像这样更改了数据库中的一列:

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

我已经尝试重置我的数据库,但我仍然收到同样的错误。

我该如何解决这个问题?

【问题讨论】:

  • 该错误看起来像是来自 PostgreSQL。您是否还在您的开发机器上使用 PostgreSQL 数据库,或者您是否在使用其他东西(例如 SQLite、MariaDB 等)?
  • @Chris 我还是个新手,但我在终端上检查了一下,显然我正在使用 MySQL
  • 您似乎在 Heroku 上使用 PostgreSQL,这是默认设置。您也应该考虑在本地安装它,让您的开发环境更接近生产环境。如果你在 OSX 上,postgresapp.com 是一个非常简单的方式来开始 Postrges。

标签: ruby-on-rails database heroku


【解决方案1】:

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

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

我推荐以下两种行动方案之一:

  • 在您的开发机器上切换到 PostgreSQL。

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

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

  • 在 Heroku 上切换到 MySQL。

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

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

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

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

【讨论】:

  • 我只是仔细检查了所有数据库的东西,毕竟我使用的是 SQLite。对不起,我对这些东西还是很熟悉的。我还应该把它切换到 PostgreSQL 吗?
  • @Andreia,我刚刚在我的答案中添加了关于 SQLite 的注释。简而言之,它不适用于 Heroku。在您的开发机器上切换到 PostgreSQL 是一个不错的选择。
  • 感谢您的回复。这样做了,现在一切正常
【解决方案2】:

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

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

如果 Postgres 的 Rails 适配器不喜欢“浮动”,您可能需要更改类型的措辞。

【讨论】:

【解决方案3】:

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

remove_column :products, :price

然后再次添加:

add_column :products, :price, :float

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

除非您有数据,否则您必须使用表达式进行更改

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2018-06-19
    • 2021-09-12
    • 2021-12-03
    • 2014-02-25
    • 1970-01-01
    • 2017-11-01
    相关资源
    最近更新 更多