我正在使用Vector Clocks实现分布式事件存储,以建立事件的确定性排序。
我正在尝试使用Django ORM执行以下原始查询:
SELECT dev_snapshots.global_snapshot_id as snapshot_id,
dev_snapshots.environment_id,
dev_snapshots.clock,
test_snapshots.environment_id,
test_snapshots.clock
FROM (
SELECT
global_snapshot_id,
clock,
environment_id
FROM environment_snapshot
WHERE environment_id = 'dev') dev_snapshots
JOIN (
SELECT
global_snapshot_id,
clock,
environment_id
FROM environment_snapshot
WHERE environment_id = 'test') test_snapshots
ON dev.global_snapshot_id = test.global_snapshot_id
ORDER BY dev_snapshots.clock, test_snapshots.clock
我的模型如下:
class Environment(models.Model):
env_name = models.TextField(primary_key=True)
current_clock = models.BigIntegerField()
class EnvironmentSnapshot(models.Model):
global_snapshot = models.ForeignKey('GlobalSnapshot')
environment = models.ForeignKey('Environment')
clock = models.BigIntegerField()
class GlobalSnapshot(models.Model):
id = models.AutoField(primary_key=True)
Environment
有一个名为clock
的名称和计数器值
EnvironmentSnapshot
是单个Environment
期间单GlobalSnapshot
个时钟值的快照。
GlobalSnapshot
为EnvironmentSnapshot
创建时存在的所有环境收集GlobalSnapshot
。
我们的想法是首先按“dev”GlobalSnapshot
的时钟值对所有Environment
进行排序,然后按“test”Environment
的时钟值进行排序。无论事件何时收到,事件的确定性顺序。 GlobalSnapshot
最终会加入事件存储中记录的事件。
我在Django中查看了Query.join()
,但它似乎没有很好的文档记录,甚至不适合最终用户使用。
Django ORM有没有办法做到这一点,或者我只需要为Django构建一个原始查询来执行?