Как удалить одну таблицу Postgres в приложении Ruby on Rails Heroku?

Аналогичный вопрос здесь, но ни один из ответов на самом деле не отвечает на вопрос. Принятый ответ показывает, как войти в консоль и уничтожить все записи. В этом случае это не то, что мне нужно.

Мне нужно полностью отказаться от одной таблицы (у нее нет ассоциаций) и воссоздать ее с существующей миграцией.

Есть что-то вроде?

heroku pg:destroy_table "Products"

Затем я запустил бы мою миграцию, и она создаст таблицу с новой схемой:

heroku run rake db:migrate

Ответ 1

Вы можете попробовать использовать heroku pg:psql. Это должно открыть консоль в вашей базе данных, где вы можете выполнить произвольный SQL:

DROP TABLE products;

Вы можете найти больше о pg: psql в документах heroku: 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

Когда вы создаете новую базу данных PG в Rails, также schema_migrations таблица schema_migrations чтобы отслеживать миграцию, которую вы schema_migrations. Если вы отпустите таблицу из консоли Heroku Postgres (heroku pg:psql), ваш файл миграции не узнает об этом, и когда вы попытаетесь снова выполнить миграцию с помощью новой схемы, рельсы не будут создавать таблицу, поскольку она уже думает, что она уже там.

Если heroku run rake db:migrate:up... не работает

Если вы уже запустили heroku pg:psql и сбросили свою таблицу (DROP TABLE products;), у вас могут возникнуть проблемы с созданием таблицы из вашей миграции, поскольку, как объяснялось выше, Rails считает, что таблица существует. В этом случае выполните следующие действия:

1. Откройте консоль psql на Heroku, создайте таблицу произвольных 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

Это должно сделать это!