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