我在数据库中更改了一个列,如下所示:
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
我已经尝试重置我的数据库,但我仍然遇到同样的错误。
我该如何解决这个问题?
答案 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
然后运行迁移应该没有任何问题
除非你有数据,否则你将不得不改变使用表达式