具有复合主键的SQL / SQLAlchemy一对多“动态”关系

时间:2019-06-27 12:11:09

标签: python sql sqlalchemy

我试图弄清楚这是否可能与SQLAlchemy声明式中的关系有关(否则,可能是原始SQL / SQLAlchemy Core)。

背景

我想要这两个表:

class Allocation:
    id = Column(Integer, primary_key=True) 
    timestamp = Column(DateTime, primary_key=True)
    days = Column(Float)
    employee: Column([a single employee])
class Employees:
    id = Column(Integer, primary_key=True) 
    timestamp = Column(DateTime, primary_key=True)
    name = Column(String(200))
    allocations: Column([a list of allocations])

理想情况下,我需要双向关系。

每个id均指及时的雇员/分配(“项目”)版本。这使我可以跟踪不同日期的项目版本。保证id总是引用相同的逻辑项目(即,项目将永远不需要切换id)。我可以通过以下方式查看具有id == 0的员工在2019-01-01的情况:

e = db.query(Employee).filter(Employee.id == 0) \
  .filter(Employee.timestamp <= datetime(2019,1,1)) \
  .order_by(desc(Employee.timestamp)) \
  .one_or_none()

复杂的因素是这种关系需要是“动态的”(我不确定这里的术语)。这是一对多的关系-每个Allocation始终都与一个Employee相关联。但是,根据所需的快照时间戳记,可能会更改哪个Employee行(因为最初分配的Employee可能会更新)。反之亦然。如果我获得了员工的分配,则仅应返回每个id的请求时间戳之前的最新分配。

示例

Employee row:
id=0
timestamp=2019-01-01
name=Joe Bloggs
allocations=[<allocation 0>]

Employee row:
id=0
timestamp=2019-01-02
name=Joe Rogers
allocations=[<allocation 0>]

Allocation row:
id=0
timestamp=2019-01-01
days=1.5
employee=[<employee 0>]

如果我要求从2019年1月1日开始分配0,则需要第一个Employee条目(“ Joe Bloggs”)作为它的返回条目。如果它是从2019年1月2日开始或更高版本,则需要第二个Employee条目(“ Joe Rogers”)随其返回。

问题

这可以使用子查询来实现,其中“分配”具有一个employee_id列:如果我们希望给雇员分配某个分配的时间戳(截至时间戳记),则我们首先获取该分配的employee_id,然后执行另一个查询该员工。

我想知道这是否可以比我刚刚描述的更有效地完成-还是超出了SQL关系的能力?

0 个答案:

没有答案