Similar question here,但没有一个答案真正回答了这个问题。接受的答案只显示如何登录到控制台并销毁所有记录。在这种情况下,这不是我需要的。
我需要完全废弃一个表(它没有关联)并使用现有的迁移重新创建它。
有类似的东西吗?
heroku pg:destroy_table "Products"
然后我会再次运行迁移,它将使用新架构创建表:
heroku run rake db:migrate
答案 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认为该表就在那里。如果是这种情况,请执行以下步骤:
products
表heroku pg:psql
CREATE TABLE products(foo int);
退出psql
终端。
heroku run rake db:migrate:down VERSION=20160518643350
这将删除新表,并记录迁移。
heroku run rake db:migrate:up VERSION=20160518643350
应该这样做!