如何在Ruby on Rails Heroku应用程序中删除单个Postgres表?

13

这里有类似的问题,但是没有一个答案真正回答了这个问题。被采纳的答案只是展示了如何登录到控制台并销毁所有记录,这不是我在这种情况下需要的。

我需要完全删除一个单独的表(它没有关联),然后使用现有的迁移重新创建它。

是否有像这样的东西?

heroku pg:destroy_table "Products"

然后我会再次运行我的迁移,它将使用新的架构创建表:

heroku run rake db:migrate

这个表是使用最后一次迁移创建的吗?如果是,只需运行 rake db:migrate:redo - PinnyM
我有一个名为Create table for user的迁移,手动删除了该迁移并创建了一个新的迁移,名称相同但字段不同。 - sergserg
嗯,你不应该在回滚之前删除迁移...现在迁移版本控制表与代码不匹配。 - PinnyM
这一定是导致我的头发变白的原因。 :) 从现在开始,我会掌握只使用迁移的技巧,并限制手动调整以防止破坏神奇的黑盒子。 - sergserg
@PinnyM:schema_migrations 不匹配你的迁移文件并没有什么问题,你可以(而且应该)定期删除旧的迁移文件,以避免它们阻塞进程。 - mu is too short
2个回答

23

3

如何正确操作

对于像我一样的用户来说:强烈建议不要像接受的回答中所建议的那样运行DROP TABLE products。 考虑改用以下方法:

heroku run rake db:migrate:down VERSION=20160518643350

VERSION 是您的迁移文件上的时间戳,即下面示例中的前缀:

db/migrate/20160518643350_create_products.rb

然后,修改您的模式(或创建一个新的迁移),并运行它:

heroku run rake db:migrate:up VERSION=20160518643350

当你在Rails中创建一个新的PG数据库时,会创建一个schema_migrations表来跟踪已经迁移的记录。如果你从Heroku的Postgres控制台(heroku pg:psql)删除一个表,那么你的迁移文件就不知道它的存在,当你尝试用新模式运行迁移时,Rails不会创建该表,因为它认为它已经存在。
如果“heroku run rake db:migrate:up…”无法工作,可能是由于之前已经使用“heroku pg:psql”并将表删除(DROP TABLE products;),因此在迁移文件中创建该表时会出现问题,因为如上所述,Rails认为该表已经存在。如果是这种情况,请按照以下步骤操作:
1. 在Heroku上打开psql控制台,并创建一个任意的产品表
heroku pg:psql
CREATE TABLE products(foo int);

退出psql终端。

2. 运行迁移向下使得schema_migrations记录删除的表

heroku run rake db:migrate:down VERSION=20160518643350

这将删除您的新表,并记录迁移。

3. 运行您的迁移以创建新表

heroku run rake db:migrate:up VERSION=20160518643350

那应该可以了!

1
非常感谢 @Matt 的回答,这让我在采用 PSQL 直接删除表之前受益匪浅。 - ayounis90

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接