Рельсы - шардинг базы данных

У меня есть следующий фрагмент кода, который копирует данные из таблицы изображений в базе данных A (shard_A) в другую таблицу в базе данных B (shard_B)

Вот структура таблицы изображений в обеих базах данных

Image table (shard_A)   -   Image table (shard_B)
- image_id              -   image_id 
- submission_fk         -   sub_fk 
- image_desc            -   img_desc

Имена столбцов в 2 таблицах немного отличаются

  @test_shard_A = Image.using(:shard_A).find(:first, :conditions => ["submission_fk =?", @sub.id ])

  Octopus.using(:shard_B) do

    Image.create(
    :image_id => @test_shard_A.image_id,
    :sub_fk => @test_shard_A.submission_fk,
    :img_desc => @test_shard_A.image_desc
    ) do |primary|
    primary.img_id = @test_shard_A.image_id
    end

  end

Выше приведено следующее сообщение об ошибке:

unknown attribute: sub_fk

Что я делаю неправильно?

1 ответ

Решение

ActiveRecord загружает метаданные (информацию о таблице) при выполнении первого запроса для таблицы. Когда вы запускаете приложение с запросом к shard_A, оно проверяет структуру таблицы и в соответствии с ней создает ваш класс Image с помощью submission_fk.

Когда вы меняете шарды, он не будет снова проверять структуру таблицы, поэтому он предполагает, что существует submission_fk, и не предполагает sub_fk, так как он не знает об этом.

Я предлагаю вам использовать одну и ту же структуру для всех шардов, но если вы не можете этого сделать, вы можете заставить ActiveRecord перезагрузить информацию таблицы - я никогда не использовал Octopus, но думаю, что это сработает:

Image.reset_column_information

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

Другие вопросы по тегам