我目前正在开发维基百科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.我找到了一个电子邮件说必须至少有一个主地图r,所以对所有数据库使用这个选项似乎不可行。
下一个想法是使用切分。为此,我们需要一种将数据库与实例(如在文档中注明 )区分开来的方法
您需要一个函数,该函数可以返回单个碎片id,给定要保存的实例;这称为"shard_chooser“
我被困在这里了。是否有一种方法可以获得数据库名称给定的对象,从它加载?还是基于引擎添加静态属性的可能性?另一种方法是在每个表中添加一个语言列,这是非常糟糕的。我在监督其他可能性吗?有什么想法吗?如何为同一个类定义多个映射器,根据不同数据库中的表进行映射?
发布于 2009-08-21 10:41:29
我在邮件列表上问了这个问题,得到了迈克尔拜尔的回答。
如果希望使用不同的类来表示它们“属于” 不同的数据库,对于这是如何的,您有非常清楚的行 执行时,使用http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName中描述的“http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName”概念。这听起来非常像您的用例。 下一个想法是使用切分。为此,我们需要一种将数据库与实例区分开来的方法,如文档中所述:“给定要保存的实例,您需要一个可以返回单个碎片id的函数;这称为"shard_chooser”水平切分是一种在多个数据库中存储许多同构实例的方法,这意味着您要在分区之间创建一个大型“虚拟”数据库--主要的概念是,单个实例基于某些规则集被放置在不同的分区中。这有点像您的用例,但是由于您有一个非常简单的描述,我认为“实体名称”方法更容易一些。
因此,基本思想是为每个期望的映射生成匿名子类,这些映射由Entity_Name来区分。详细信息可以在迈克尔·林克中找到
https://stackoverflow.com/questions/1308765
复制相似问题