Миграция Ruby on Rails - создание новой схемы базы данных - PullRequest
2 голосов
/ 18 сентября 2008

У меня есть миграция, которая запускает сценарий SQL для создания новой схемы Postgres. При создании новой базы данных в Postgres по умолчанию она создает схему под названием public, которая является основной схемой, которую мы используем. Миграция для создания новой схемы базы данных, кажется, работает нормально, однако проблема возникает после запуска миграции, когда rails пытается обновить таблицу 'schema_info', на которую она опирается, говорит, что она не существует, как если бы она была ищет его в новой схеме базы данных, а не в общедоступной схеме по умолчанию, где на самом деле находится таблица.

Кто-нибудь знает, как я могу сказать рельсам посмотреть на 'public' схему для этой таблицы?

Пример выполнения SQL: ~

CREATE SCHEMA new_schema;
COMMENT ON SCHEMA new_schema IS 'this is the new Postgres database schema to sit along side the "public" schema';
-- various tables, triggers and functions created in new_schema

Ошибка: ~

RuntimeError: ERROR C42P01  Mrelation "schema_info" does not exist
L221    RRangeVarGetRelid: UPDATE schema_info SET version = ??

Спасибо за вашу помощь

Крис Найт

Ответы [ 3 ]

5 голосов
/ 18 сентября 2008

Ну, это зависит от того, как выглядит ваша миграция, как выглядит ваш database.yml и что именно вы пытаетесь предпринять. В любом случае требуется дополнительная информация, измените имена, если необходимо, и опубликуйте пример database.yml и миграцию. например, миграция меняет путь поиска для адаптера?

Но знайте, что в целом схемы rails и postgresql плохо работают вместе (пока?).

Есть несколько мест, где есть проблемы. Попробуйте создать приложение, которое использует только одну базу данных pg с двумя схемами, отличными от заданных по умолчанию: одна для разработки и одна для тестирования, и расскажите мне об этом. (из приведенного ниже я уже могу сказать вам, что вы обожжетесь)

Возможно, это было исправлено с тех пор, как я в последний раз играл с ним, но когда я вижу http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-name-breaks-when-non-default-schema-is-used или это http://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-generating-correct-schema-list или это в postgresql_adapter.rb

  # Drops a PostgreSQL database
  #
  # Example:
  #   drop_database 'matt_development'
  def drop_database(name) #:nodoc:
    execute "DROP DATABASE IF EXISTS #{name}"
  end

(да, это неправильно, если вы используете одну и ту же базу данных с разными схемами как для dev, так и для test, при каждом запуске модульных тестов обе базы данных будут отбрасываться!)

Я действительно начал писать патчи. первый был для методов indexes в адаптере, которые не заботились о том, что search_path заканчивался дублированием индексов в некоторых условиях, затем я начал страдать от остального и отказался от идеи использования схем: я хотел получить мое приложение завершено, и у меня не было дополнительного времени, необходимого для решения проблем, которые я имел при использовании схем.

0 голосов
/ 14 августа 2013

Вы можете использовать pg_power . Он предоставляет дополнительные DSL для миграции для создания схем PostgreSQL и не только.

0 голосов
/ 18 сентября 2008

Я не уверен, что понимаю, что именно вы спрашиваете, но rake будет ожидать обновления версии схемы Rails в таблицу schema_info. Проверьте файл конфигурации database.yml, здесь rake будет искать таблицу для обновления.

Возможно ли, что вы переходите на новую схему Postgres и rake все еще указывает на старую схему? Тогда я не уверен, что вам нужна стандартная миграция Rails. Лучше создать вместо этого собственную задачу для рейка.

Edit: Если вы ссылаетесь на две разные базы данных или схемы Postgres, Rails не поддерживает это в стандартных миграциях. Rails предполагает одну базу данных, поэтому миграция из одной базы данных в другую обычно невозможна. Когда вы запускаете "rake db: migrate", он фактически просматривает переменную среды RAILS_ENV, чтобы найти правильную запись в database.yml. Если rake начнет миграцию, просматривая среду «разработки» и конфигурацию базы данных из database.yml, он будет ожидать обновления этой среды в конце миграции.

Итак, вам, вероятно, потребуется сделать это вне стека Rails, поскольку вы не можете ссылаться на две базы данных одновременно в Rails. Существуют попытки использования плагинов, чтобы разрешить это, но они в основном взломаны и не работают должным образом.

...