2008-09-18 4 views
2

У меня есть миграция, которая запускает SQL-скрипт для создания новой схемы Postgres. При создании новой базы данных в Postgres по умолчанию создается схема, называемая «public», которая является основной схемой, которую мы используем. Перенос для создания новой схемы базы данных работает нормально, однако проблема возникает после выполнения миграции, когда рельсы пытаются обновить таблицу «schema_info», на которую она опирается, говорит, что она не существует, как если бы она была ищет его в новой схеме базы данных, а не по умолчанию «общедоступная» схема, где фактически находится таблица.Ruby on Rails Migration - Создать новую схему базы данных

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

Пример 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 = ?? 

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

Chris Knight

+0

, возможно, вы захотите изменить свой вопрос, чтобы уточнить, когда вы говорите о схеме rails db и когда вы говорите о схемах postgres. – kch 2008-09-18 09:57:56

+0

также, давая пример и называя вещи помогают. абстрактное описание вашей проблемы сложнее понять для нас, не связанных с вашим приложением. – kch 2008-09-18 10:01:45

ответ

5

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

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

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

Может быть, это было зафиксировано, так как в последний раз я играл с ним, но когда я вижу 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.Р.Б.

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

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

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

0

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

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

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^