在尝试将本地数据库推送到Heroku后出现“ActionView::Template::Error(未知表的主键”。
在尝试将本地数据库推送到Heroku后出现“ActionView::Template::Error(未知表的主键”。
我最近在Heroku上托管的一个Ruby-on-Rails应用中下载了一个备份文件,然后在本地进行了恢复,并从外部来源向数据库添加了数据。一切都正常工作。
在使用heroku pg:push
将更新后的数据库推送到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数据库。Heroku有关于如何升级Postgres版本的文档,但从他们的示例中并不完全清楚我需要做什么。我猜我基本上需要创建一个新的数据库,将数据从旧数据库复制到新数据库,然后销毁旧数据库。有人做过这样的操作吗?这样做是否需要付费?升级Postgres版本是否已经解决了其他人的这个问题?
在推送本地数据库到Heroku时出现了"ActionView::Template::Error (Unknown primary key for table"的错误。这个问题的原因是数据库的主键未知,解决方法是升级数据库。
根据文档,你可以选择使用pg:copy
和pg:upgrade
两种方法来升级数据库。在这种情况下,我推荐使用pg:copy
,这种方法更简单,但需要在升级过程中将数据库关闭。这应该不是问题,因为你的数据库目前并没有工作。
pg:upgrade
只有在进行PG复制升级所需的停机时间对你的业务来说不可接受时才应该使用。
使用PG复制进行升级的步骤如下(所有步骤的详细说明在链接中):
1. 创建新数据库:你需要创建一个新的数据库,它将自动使用Heroku的最新版本的PostgreSQL(在你的情况下是9.6)。
heroku addons:create heroku-postgresql:standard-0
2. 防止新数据库更新:将当前数据库设为只读模式,以避免在复制到新数据库时出现数据损坏。
heroku maintenance:on
3. 将数据转移到新数据库:你需要将所有数据从旧数据库复制到新数据库。
heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_PINK --app sushi
4. 提升新数据库:你需要告知Heroku你将使用新的数据库而不是旧的数据库。
heroku pg:promote HEROKU_POSTGRESQL_PINK
5. 最后一步:使应用程序处于活动状态:现在应该一切正常了,只需激活你的数据库,以便保存新的查询。
heroku maintenance:off
可以看到,所有步骤都很简单。因此,如果升级PostgreSQL的版本无法解决问题,你仍然可以在删除旧数据库之前切换回旧版本。
关于价格,我认为这取决于你当前的订阅类型(Hobby、Standard或Premium)。具体价格可以参考Heroku的定价页面(https://www.heroku.com/pricing)。费用可能是免费的,也可能很便宜,但我认为还取决于你的数据库大小。为了确保不会花费太多,你可以直接向Heroku支持团队咨询(https://devcenter.heroku.com/articles/paid-support)。
ActionView::Template::Error (Unknown primary key for table " after trying to push local database to Heroku)这个问题的出现的原因是在部署到Heroku时,数据库中的表没有设置主键。解决方法是手动在数据库中为表添加主键。
解决方法:
1. 删除当前模型并生成一个新的模型,新模型是旧模型的副本,并且会创建一个迁移文件。例如,运行以下命令生成一个名为ad的模型:
rails generate model ad name:string description:text price:decimal seller_id:integer email:string img_url:string
2. 在创建新模型之前,使用seed_dump gem创建一个种子文件。运行rake db:seed
命令将数据导入新模型中。
3. 在模型中添加关联关系。例如,在owner模型中添加has_many :customers
来连接customer模型。
另一种情况是在RazorSQL中运行查询并从查询结果生成一个新表,并将其导入到postgres中。问题是该表没有主键。可以使用以下命令在postgres中手动创建主键:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
这将为表添加一个自动递增的主键字段。
希望这能帮到你。