Как удалить одну таблицу 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
Это должно сделать это!