【问题标题】:Multiple Mappers for the same class in different databases不同数据库中同一类的多个映射器
【发布时间】:2010-11-21 11:31:49
【问题描述】:

我目前正在开发一个 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.

我找到了一个email saying that there must be at least one primary mapper,所以对所有数据库都使用这个选项似乎不可行。

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

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

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

【问题讨论】:

    标签: sqlalchemy orm multiple-databases


    【解决方案1】:

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

    如果您想要不同的课程 表明他们“属于”一个
    不同的数据库,你有非常 明确说明这是怎么回事
    执行,使用“实体名称” 概念描述于 http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName .这听起来很像你的用途 案例。

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

    水平分片是一种 存储许多同类实例 跨多个数据库,与 暗示你正在创造一个 大型“虚拟”数据库 分区 - 主要概念是 单个实例得到 基于放置在不同的分区 在一些规则集上。这是一点 也喜欢你的用例,但因为 你有一个非常简单的描述 认为“实体名称”的方法是 更容易。

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

    【讨论】:

      猜你喜欢
      • 2022-10-23
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 2011-06-03
      相关资源
      最近更新 更多