我试图弄清楚这是否可能与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关系的能力?