12

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

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

有没有类似的东西?

heroku pg:destroy_table "Products"

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

heroku run rake db:migrate
4

2 回答 2

22

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

DROP TABLE products;

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

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

于 2013-01-02T17:16:41.483 回答
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;(如果是这种情况,请采取以下步骤:

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

应该这样做!

于 2016-07-26T16:13:09.077 回答