不同数据库中同一类的多个Mapper

时间:2009-08-20 20:57:30

标签: sqlalchemy orm multiple-databases

我目前正在开发Wikipedia API,这意味着我们有一个 我们想要使用的每种语言的数据库。每个的结构 数据库是相同的,它们的语言不同。唯一的 存储此信息的位置在数据库的名称中。

当从一种语言开始时,使用a的直接方法 表与所需类(例如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.

我找到了email saying that there must be at least one primary mappe r,因此对所有数据库使用此选项似乎不可行。

下一个想法是使用分片。为此,我们需要一种方法 区分 从实例的角度看,数据库之间的关系为noted in the docs

  

“你需要一个可以返回的功能   给定一个实例的单个分片ID   得救;这就是所谓的   “shard_chooser”

我被困在这里。有没有办法获得给定的数据库名称 宾语 它是从?或者可以基于添加静态属性 引擎?另一种方法是为每个人添加一个语言列 表只是丑陋的。 我是否在监督其他可能性?任何想法如何定义多个 同一个类的映射器,映射不同的表 数据库?

1 个答案:

答案 0 :(得分:2)

I asked this question on a mailing list and got this answer by Michael Bayer

  

如果你喜欢不同的课程   表明他们“属于”   不同的数据库,你有很多   关于这是怎样的明确界限   执行,使用“entity_name”   概念描述于   http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName   。这听起来非常像你的使用   情况下。

     
    

下一个想法是使用分片。为此,我们需要一种方法     区分     如上所述,从实例的角度看数据库之间的关系     在     文档:     “你需要一个可以返回单个分片ID的函数,给定一个     要保存的实例;这被称为“shard_chooser”

  
     

水平分片是一种方法   存储许多同类实例   跨越多个数据库,用   意味着你正在创造一个   其中的大“虚拟”数据库   分区 - 主要概念是   个别实例得到的   放在不同的分区基础上   在一些规则集上。这有点儿   就像你的用例一样,但从那以后   你有一个非常简单的描述我   认为“实体名称”的方法是   更容易。

因此,基本思想是为每个所需的映射生成匿名子类,这些子类由 Entity_Name 区分。详细信息可在Michaels Link

中找到