繁体   English   中英

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

[英]SQL/SQLAlchemy one-to-many “dynamic” relationship with composite primary keys

我试图弄清楚这是否可能与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指的是及时的Employee / Allocation(“项目”)版本。 这使我可以跟踪不同日期的项目版本。 确保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关系的能力?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM