Вопрос

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

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

Пример выполняемого 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 = ??

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

Крис Найт

Это было полезно?

Решение

Ну, это зависит от того, как выглядит ваша миграция, как выглядит ваш 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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top