使用ORM

时间:2018-06-13 15:21:15

标签: python mysql sqlalchemy

模式中常见的关系类型是:joiner表具有datetime元素,用于存储有关两个其他表的行之间关系的历史记录。这些关系是一对一或一对多的,即使我们使用通常意味着多对多的关联表。在任何给定的时间点,只有一个映射,即该时间点的最新映射是有效的。例如:

Tables: 
    Computer: [id, name, description]
    Locations: [id, name, address]
    ComputerLocations: [id, computers_id, locations_id, timestamp]

一个Computers对象一次只能属于一个Locations个对象(Locations可以有多个Computers),但我们会将历史记录存储在表中。 ComputerLocations中的行不会被删除,只会在查询时被新行取代。也许在将来,一些修剪类型事件将删除旧行,因为它们的用处减少了。

我正在做的是在SQLAlchemy中对此进行建模,特别是在ORM中,以便Computers类具有以下属性:

  1. 可以在没有(独立于)位置的情况下创建新计算机(这是有道理的,因为位置表是独立的)
  2. 可以在没有(独立于)计算机的情况下创建新位置
  3. 如果计算机有位置,则它必须是位置(外键约束)的成员
  4. 更新现有Computers对象的位置时,新行将添加到ComputerLocations,日期时间为NOW()
  5. 在创建包含位置的新Computers对象时,新行将添加到ComputerLocations,日期时间为NOW()
  6. 一切都应该是原子的(即如果创建了一台新计算机但是无法创建与某个位置关联的行,则会失败)
  7. SQLAlchemy ORM中是否有特定的设计模式或具体方法来实现此目的?该文档有一个关于Non-traditional mappings的部分,其中包括将一个类映射到多个表和任意选择,因此这看起来很有希望。还有另一个提到vertical tables的stackoverflow问题。由于我对SQLAlchemy的相对缺乏经验,我无法将这些信息合成为一个强大而优雅的解决方案。任何帮助将不胜感激。

    我使用的是MySQL,但通过SQLAlchemy方言系统,任何数据库的解决方案都应该足够通用。

0 个答案:

没有答案