我目前正在开发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”
我被困在这里。有没有办法获得给定的数据库名称 宾语 它是从?或者可以基于添加静态属性 引擎?另一种方法是为每个人添加一个语言列 表只是丑陋的。 我是否在监督其他可能性?任何想法如何定义多个 同一个类的映射器,映射不同的表 数据库?
答案 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
中找到