
[英]SQLAlchemy: can't understand this one2many relationship with composite keys
[英]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.