【问题标题】:SQLAlchemy, using the same model with multiple tablesSQLAlchemy,对多个表使用相同的模型
【发布时间】:2014-08-22 16:12:22
【问题描述】:

我拥有跨多个相同表分区的特定实体的数据,这些表通常按时间顺序或按数字范围分隔。例如,我可能有一个 mytable 用于当前数据的表,mytable_2013 用于去年的数据,mytable_2012 等等。

只有当前表被写入。其他的只是咨询。使用 SQLAlchemy,我有什么方法可以在使用声明性模型时指定要查询的表?

【问题讨论】:

  • 请在Concrete Table Inheritance 部分查看stackoverflow.com/a/22825638/99594。我不想重新发布它作为答案,因为它很长。在您的情况下,您只能在处理当前数据时查询MyTable,并在查找所有历史记录时执行polymorphic 搜索。
  • 谢谢。我的情况更简单,它是水平分布的同一个实体,而不是由继承定义的多个实体。考虑到这一点,它似乎与下面@viktor.likin 回答的解决方案相同。
  • 继承只是让 SA 跨多个表进行查询的一个技巧。但如果你不需要,viktor 的解决方案是完美的。请注意,如果您的表中有外键,则需要使用 declared_attr
  • 是的,我只是偶然发现了这一点。您能否澄清关于继承只是让 SA 跨多个表查询的技巧的观点。这适用于我正在做的水平分区吗? SQLAlchemy 自动执行 UNION?
  • 是的,它可以与您正在进行的水平分区一起使用。诀窍是查询所有(或部分)(假)继承树polymorphically。这就是说:如果您让 SA 认为所有这些表都是 MyBaseTable 的“子表”,并且您以多态方式执行查询,SA 将自动从所有这些表(mytablemytable_2012 等)中获取数据为你。事实上,SA 会自动执行UNION

标签: python sqlalchemy


【解决方案1】:

使用 mixins 并通过对象属性更改表名。

class Node(Base):
  __tablename__ = 'node'
  nid = Column(Integer, primary_key=True)
  uuid = Column(String(128))
  vid = Column(Integer)

class Node1(Node):
  __tablename__ = 'node_1'

class Node2(Node):
  __tablename__ = 'node_2'

【讨论】:

  • 这种方法没有公认的答案复杂。这是一个使用类似方法的食谱的链接:bitbucket.org/zzzeek/sqlalchemy/wiki/UsageRecipes/EntityName
  • 不再工作,产生NoForeignKeysError("Can't find any foreign key relationships between 'Node and 'Node1'.",)
  • 答案是正确的,代码不是(或不再是;-))。通过 a) 将 Node-class 复制为 class NodeMixin(object): 后跟 Node-class 但没有 __table_name__-property 的列定义和 b) 为 @987654329 定义 mixin @ 和 Node2 继承自 mixin 和 Base,例如。 G。 class Node1(NodeMixin, Base): __tablename__ = "node_1"。见:docs.sqlalchemy.org/en/14/orm/…
【解决方案2】:

根据要求,重新发布作为答案:

请查看Concrete Table Inheritance 部分中对Mapping lots of similar tables in SQLAlchemy 的回复。
在您的情况下,您只能在处理当前数据时查询MyTable,并在需要整个历史记录时对所有表进行多态搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2019-01-09
    • 2020-03-15
    • 2021-12-09
    • 2016-03-11
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多