【问题标题】:How to drop a single Postgres table in a Ruby on Rails Heroku app?如何在 Ruby on Rails Heroku 应用程序中删除单个 Postgres 表?
【发布时间】:2012-12-17 01:31:20
【问题描述】:

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

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

有类似的吗?

heroku pg:destroy_table "Products"

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

heroku run rake db:migrate

【问题讨论】:

  • 此表是在上次应用迁移的情况下创建的吗?如果是这样,只需执行rake db:migrate:redo
  • 我有一个迁移 Create table for user,手动删除了该迁移并创建了一个名为相同但不同字段的新迁移。
  • 嗯,您不应该在回滚之前删除迁移...现在迁移版本控制表与代码不匹配。
  • 这一定是导致我头发变白的原因。 :) 从现在开始,我将掌握仅使用迁移的窍门,并限制手动调整以防止破坏魔法黑匣子。
  • @PinnyM:schema_migrations 与您的迁移不匹配没有什么问题,您可以(并且应该)不时删除旧迁移以防止它们阻塞。

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


【解决方案1】:

您可以尝试使用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

【讨论】:

    【解决方案2】:

    如何正确地做到这一点

    对于像我这样到达这里的人:强烈考虑按照接受的答案中的建议不要运行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
    

    应该这样做!

    【讨论】:

    • 非常感谢@Matt 的回答,这在我冒险通过 PSQL 直接删除表之前帮助了我。
    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多