0

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

当从一种语言开始时,使用表与所需类(例如页面)之间的映射的直接方法看起来很好。我们定义了一个引擎和相应的元数据。当我们为引擎和元数据添加第二个数据库时,我们遇到了以下错误:

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.

我发现一封电子邮件说必须至少有一个主映射器,因此对所有数据库使用此选项似乎不可行。

下一个想法是使用分片。为此,我们需要一种从实例的角度区分数据库的方法,如文档中所述

“您需要一个可以返回单个分片 ID 的函数,给定一个要保存的实例;这称为“shard_chooser”

我被困在这里。有没有办法在给定加载它的对象的情况下获取数据库名称?还是可以根据引擎添加静态属性?另一种方法是为每个丑陋的表添加一个语言列。我是否在监督其他可能性?任何想法如何为同一个类定义多个映射器,映射到不同数据库中的表?

4

1 回答 1

2

我在邮件列表上问了这个问题,并得到了 Michael Bayer 的回答

如果您希望不同的类表明它们“属于”
不同的数据库,并且您对如何执行此操作有非常清楚的说明,请使用http://www.sqlalchemy.org/
中描述的“实体名称”概念 trac/wiki/UsageRecipes/EntityName 。这听起来很像你的用例。

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

水平分片是一种跨多个数据库存储许多同类 实例的方法,这意味着您正在分区之间创建一个大型“虚拟”数据库 - 主要概念是单个实例根据某些规则集放置在不同的分区中。这也有点像您的用例,但由于您的描述非常简单,我认为“实体名称”方法更容易。

所以基本思想是为每个所需的映射生成匿名子类,这些映射由Entity_Name区分。详情可在Michaels Link中找到

于 2009-08-21T10:41:29.233 回答