PGError: ОШИБКА: компании-отношения не существуют (postgresql, mysql, rails 3)

Недавно я добавил PostgreSQL в свое приложение, которое уже работало на MySQL, теперь приложение работает на двух базах данных. Мне удалось установить связи между таблицами, присутствующими в разных базах данных, и они работают нормально. Сегодня я добавил функцию поиска на страницу, которая использует таблицы, присутствующие в двух базах данных, и выдает ошибку. Целый день пытался разобраться с ошибкой, но безуспешно. Пожалуйста, посмотрите на ассоциации, код и помогите мне исправить это.

У меня есть 4 таблицы: -

Компания (mysql)

Местоположение (mysql)

Отчет (PostgreSQL)

Категория_отчета (PostgreSQL)

модель - компания.рб

establish_connection Rails.env+"_postgres"
has_many :reports

establish_connection Rails.env
belongs_to :location

location.rb

has_many :companies

отчет.рб

establish_connection Rails.env
belongs_to :company

establish_connection Rails.env+"_postgres"
belongs_to :report_category

report_category.rb

establish_connection Rails.env+"_postgres"
has_many :report

Теперь из представления я передаю параметры поиска и в своем report_controller пишу

@reports = Report.where("companies.name like ? and report_category.name ?", params[:company], params[:category]).includes(:company, :report_category)

после выполнения этой строки я получаю следующую ошибку

ActiveRecord::StatementInvalid: PGError: ERROR:  relation "companies" does not exist

но

Company.where("location.name like ?", params[:location]).includes(:location)

or

Report.where("report_categories.name like ?", params[:category]).includes(:report_category)

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


person anil.n    schedule 25.01.2012    source источник
comment
Почему-то я сомневаюсь, что рельсы достаточно умны, чтобы разобрать аргумент и понять, что вы используете две разные системы СУБД полностью в одном запросе, и он отправляет все это только в postgres. Поскольку postgres вообще ничего не знает о том, что находится в mysql, он справедливо жалуется на отсутствие таблицы компаний.   -  person Marc B    schedule 26.01.2012
comment
С какой стати у вас одни таблицы в MySQL, а другие в PostgreSQL. У вас должно быть все в одном из них.   -  person a_horse_with_no_name    schedule 26.01.2012
comment
@MarcB, так что решения нет?   -  person anil.n    schedule 26.01.2012
comment
@a_horse_with_no_name Приложение работает с mysql последние 3 года, и в последнее время в это приложение поступают огромные данные, поэтому мы решили использовать postgresql, видя его производительность на больших данных ... мы не можем рисковать, перемещая все данные mysql в постгрескл.   -  person anil.n    schedule 26.01.2012
comment
На мой взгляд, это довольно сомнительная стратегия. Вы либо выполняете миграцию, либо нет. Помимо всех проблем, с которыми вы столкнетесь (как вы только что обнаружили), эта установка не даст вам реального указания, будет ли PostgreSQL лучше соответствовать вашим требованиям или нет.   -  person a_horse_with_no_name    schedule 26.01.2012
comment
Эхо лошади без имени ... postgres - это отдельный язык от t-sql, который mysql использует для начинающих. Что вы считаете «большими данными»? MySQL масштабируется до терабайт, прежде чем достигнет логических пределов. Если вы работаете с этими большими наборами данных, postgres — не лучшая альтернатива, вы можете рассмотреть устройства для хранения данных, такие как netezza от IBM, или базы данных в виде столбцов, такие как Vertica. Настоятельно рекомендую вам переосмыслить эту стратегию   -  person Twelfth    schedule 27.01.2012


Ответы (1)


Во-первых, я хочу поддержать предложение в комментариях перенести все на одну базу данных. Это избавит вас от многих сложностей в будущем. Однако, если вы действительно не можете этого сделать, есть несколько способов получить доступ к таблицам MySQL из PostgreSQL, и это будет второсортным решением полной миграции, но оно будет работать.

В PostgreSQL 9.1 и выше вы можете выполнять запросы только для чтения, используя сторонние оболочки данных для MySQL. В более ранних версиях для установления соединения можно использовать проект DBI-Link Дэвида Феттера.

Затем они позволяют вам представлять ваши данные в виде единой базы данных для ваших приложений.

person Chris Travers    schedule 24.03.2013