尝试将本地数据库推送到 Heroku 后出现“ActionView::Template::Error (Unknown primary key for table”

Posted

技术标签:

【中文标题】尝试将本地数据库推送到 Heroku 后出现“ActionView::Template::Error (Unknown primary key for table”【英文标题】:"ActionView::Template::Error (Unknown primary key for table" after trying to push local database to Heroku 【发布时间】:2018-02-05 03:41:53 【问题描述】:

对于我通过 Heroku 托管的 Ruby-on-Rails 应用程序,我最近下载了一个备份,将其还原到本地,然后从外部来源将数据添加到数据库中。这一切都很好。

使用heroku pg:push <localdbname> HEROKU_DATABASE_URL --app <appname> 将更新的数据库推送到 Heroku 后,应用程序运行良好,我可以看到新添加的数据。

但是,今天当我尝试登录 Heroku 上的应用程序时,我收到了错误消息。在我的日志文件中,我看到了这个错误:

ActionView::Template::Error (Unknown primary key for table ...

根据这个 SO 帖子:Getting "Unknown primary key for table" while the ID is there

一个用户可以通过多次重置并将数据库推送到 Heroku 来解决这个问题。但是,这对我没有用。我现在至少尝试了 4 次重置和推送数据库。

一种可能是我的本地 postgres 数据库使用的是 9.6 版,而应用程序使用的是 9.4 版。 Heroku 数据库是 Hobby-Basic 数据库。有documentation from Heroku on how to upgrade the Postgres version,但从他们的例子中我并不完全清楚我需要做什么。我猜我基本上需要创建一个新数据库,将数据从旧的复制到新的,然后销毁旧的。有没有人这样做过?这样做会产生费用吗?并且远程升级 Postgres 的版本是否为其他人解决了这个问题?

【问题讨论】:

【参考方案1】:

根据文档,您可以选择how to upgrade your database。 pg:copypg:upgrade

在您的情况下,我建议pg:copy:这更容易,但需要在您进行升级时“关闭”您的数据库。这应该不是问题,因为您的数据库当前不工作。

pg:upgrade 仅应在 PG 副本需要停机时使用 升级对您的业务来说太长了。

Upgrade with PG copy:(所有步骤在链接中都有详细说明)

提供新数据库

您需要创建一个新数据库,它将自动使用最新版本的 postgresql for heroku(在您的情况下为 9.6)

heroku addons:create heroku-postgresql:standard-0
阻止新的数据库更新

停止当前数据库的写入模式,以避免在复制到新数据库时损坏数据

heroku maintenance:on
将数据传输到新数据库

您需要将旧数据库中的所有数据复制到新数据库中。

heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_PINK --app sushi
推广新数据库

您需要通知 heroku 您将使用新数据库而不是旧数据库。

heroku pg:promote HEROKU_POSTGRESQL_PINK
最后一步:激活应用程序

现在一切都应该好了,只需激活您的数据库,以便它可以保存新查询。

heroku maintenance:off

如您所见,所有步骤都很简单。因此,如果升级您的 postgreSQL 版本不能解决问题,您仍然可以在删除之前切换回旧版本

定价

我认为这取决于您的订阅(爱好、标准或高级)https://www.heroku.com/pricing。它可能是免费的,也可能是便宜的,但我认为这也取决于您的数据库的大小。

为了确保不会花费您太多,我相信您可以直接向 Heroku 支持人员咨询https://devcenter.heroku.com/articles/paid-support。

【讨论】:

【参考方案2】:

我之前也遇到过类似的问题。我在 RazorSQL 的 Rails 之外创建了一个 postgres 数据库。我从外部来源导入数据,当我在本地运行它时一切正常。在部署时,我遇到了各种各样的问题。

    我在 Rails 之外创建了表,因此没有创建迁移。我必须通过删除当前模型并生成一个新模型来重新创建表,该模型是旧模型的副本,只有这次创建迁移,例如:

    rails 生成模型广告名称:字符串描述:文本价格:十进制 卖家ID:整数电子邮件:字符串img_url:字符串

    我需要从我已经创建的数据库中导入数据,在我做任何事情之前,我实际上使用这个 gem https://github.com/rroblak/seed_dump 创建了一个种子文件。当我再次创建模型(记得删除模型并重新创建它)时,我所要做的就是运行rake db:seed并将数据拉入。

3.我要做的最后一件事是在模型中插入关联,例如在所有者模型中放入 has many: customers 以连接客户模型。

另一个场景是我在 RazorSQL 中运行了一个查询,并从查询中生成了一个新表并将其导入到 postgres 中。问题是它只是一个来自结果的表,因此它没有主键。我必须使用 ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY; 在 postgres 中手动创建它,这给了我一个自动递增的主键字段,我必须感谢这个答案,它帮助了我 https://***.com/a/2944561/7039895。

希望这会有所帮助。

【讨论】:

以上是关于尝试将本地数据库推送到 Heroku 后出现“ActionView::Template::Error (Unknown primary key for table”的主要内容,如果未能解决你的问题,请参考以下文章

将应用程序部署到 Heroku 后无法推送到 Github

已成功上传到 Heroku Local,但一旦推送到 Heroku live 就会出现 503 错误

如何更新堆栈并将克隆的应用程序推送到 Heroku [重复]

Mongodb atlas + node.js 在本地工作,但在推送到 Heroku 时停止

将 Django 应用程序推送到 Heroku 后,Dynos 字段为空白

将数据库推送到heroku:如何使用heroku pg:push