Несколько картографов для одного класса в разных базах данных - PullRequest
0 голосов
/ 21 августа 2009

В настоящее время я работаю над API Википедии, что означает, что у нас есть база данных для каждого языка, который мы хотим использовать. Структура каждого База данных идентична, они различаются только по своему языку. Единственный место, где хранится эта информация, находится в имени базы данных.

При запуске с одного языка прямой подход к использованию отображение между таблицами на необходимые классы (например, Page) выглядело хорошо. Мы определили движок и соответствующие метаданные. Когда мы добавили второй База данных с собственной настройкой для движка и метаданных мы столкнулись с следующая ошибка:

ArgumentError:
Class '<class 'wp.orm.types.pages.Page'>' already has a primary mapper defined.
Use non_primary=True to create a non primary Mapper.clear_mappers() will remove
*all* current mappers from all classes.

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

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

"Вам нужна функция, которая может вернуть один идентификатор шарда, данный экземпляр быть спасенным; это называется "Shard_chooser"

Я застрял здесь. Есть ли способ получить имя базы данных с учетом объект загружается из? Или возможность добавить статический атрибут на основе двигатель? Альтернативой было бы добавить языковой столбец к каждому стол, который просто уродлив. Я наблюдаю за другими возможностями? Любые идеи, как определить несколько картографы для одного и того же класса, которые сопоставляются с таблицами в разных базы данных?

1 Ответ

2 голосов
/ 21 августа 2009

Я задал этот вопрос в списке рассылки и получил ответ от Майкла Байера :

если вы хотите, чтобы отдельные классы указать, что они "принадлежат" в
другая база данных, и у вас есть очень четкие линии относительно того, как это
выполнено, используйте "имя_хозяйства" Концепция описана в http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName , это звучит очень похоже на ваше использование случай.

Следующая идея - использовать шардинг. Для этого нам нужен способ различать между базами данных с точки зрения экземпляра, как отмечено в документы: «Вам нужна функция, которая может возвращать один идентификатор шарда, учитывая экземпляр для сохранения; это называется "shard_chooser"

горизонтальный шардинг является методом хранение многих однородных экземпляров через несколько баз данных, с подразумевается, что вы создаете один большая «виртуальная» база данных среди перегородки - основная концепция что отдельный экземпляр получает размещены в разных разделах на основе на некотором наборе правил. Это немного как ваш вариант использования, но так как у вас есть очень простое разграничение я думаю, что подход "имя объекта" проще.

Таким образом, основная идея состоит в том, чтобы генерировать анонимные подклассы для каждого желаемого отображения, которые отличаются Entity_Name . Подробности можно найти в Michaels Link

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...