如何使用exto连接多个存储库?

yvfmudvl  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(300)

我有两个数据库,主数据库(postgresql)+统计数据库(clickhouse)。统计数据库包含来自主数据库的数据子部分,这些数据足以执行计算。所有ID都相似( :binary_id )跨两个数据库。我需要找到一种方法,将从统计数据库获得的结果与查询连接到主数据库。就纯sql解决方案而言,可能是这样的,其中 VALUES 是否从统计数据库获取数据:

SELECT p0."id",
       p0."name",
       f1."average_count"
FROM "persons" AS p0
         JOIN (VALUES (0.0, '906af2c0-cde2-4996-9a98-bdbf986fe687'::uuid),
                      (0.2857142857142857, 'aba7c694-3453-4a55-aab9-4b542dbb4ba9'::uuid),
                      (0.2857142857142857, '2dab3350-6149-4752-a55e-7477a6ad0dd3'::uuid))
               as f1 (average_count, user_id)
              on f1.user_id = p0.id;

我的项目积极地使用了exto,并且有很多即时构建的查询。这就是为什么我不能像上面所说的那样只执行纯sql查询,而应该使用基于exto的解决方案。有没有一种方法可以和星外行星做这样的连接?

lmyy7pcs

lmyy7pcs1#

虽然不漂亮,但你可以利用postgres的优势 UNNEST :

users = [
  %{id: "906af2c0-cde2-4996-9a98-bdbf986fe687", average_count: 0.0},
  %{id: "aba7c694-3453-4a55-aab9-4b542dbb4ba9", average_count: 0.2857142857142857},
  %{id: "2dab3350-6149-4752-a55e-7477a6ad0dd3", average_count: 0.2857142857142857}
]

{ids, average_counts} =
  users
  |> Stream.map(&{&1.id, &1.average_count})
  |> Enum.unzip()

dumped_ids =
  for id <- ids do
    {:ok, dumped} = Ecto.UUID.dump(id)
    dumped
  end

query =
  from p in Person,
    join: f in fragment("SELECT UNNEST(?::uuid[]) AS user_id, UNNEST(?::float[]) AS average_count", ^dumped_ids, ^average_counts),
    on: f.user_id == p.id,
    select: %{id: p.id, name: p.name, average_count: f.average_count}

Repo.all(query)

也许这不是最好的方法。我不是dbMaven。但这在iex中对我有效。

相关问题