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

时间:2013-01-02 17:12:00

标签: ruby-on-rails-3 postgresql heroku drop-table

Similar question here,但没有一个答案真正回答了这个问题。接受的答案只显示如何登录到控制台并销毁所有记录。在这种情况下,这不是我需要的。

我需要完全废弃一个表(它没有关联)并使用现有的迁移重新创建它。

有类似的东西吗?

heroku pg:destroy_table "Products"

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

heroku run rake db:migrate

2 个答案:

答案 0 :(得分:19)

您可以尝试使用heroku pg:psql。这应该打开一个数据库控制台,您可以在其中执行任意SQL:

DROP TABLE products;

您可以在heroku docs中找到有关pg:psql的更多信息:https://devcenter.heroku.com/articles/heroku-postgresql#pgpsql

PostgreSQL文档相同:http://www.postgresql.org/docs/9.1/static/sql-droptable.html

答案 1 :(得分: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控制台,创建一个任意products

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

应该这样做!