使用 Elixir - Ecto 进行复杂查询

Using Elixir - Ecto for complex queries

所以我正在将节点应用程序转换为 Elixir,并且有一些我想使用 Ecto 的查询,但我还没有找到可行的方法,并且想避免连接字符串和参数如果可能的话。

我有大约 10 个查询链接在一个交易中,看起来有点像这样:

INSERT INTO user_servers(user_id, server_id, server_type_code,      position,                 active_flag,   create_date,      created_by)
                 SELECT   ?,         ?,      'SERVER',      (COALESCE(MAX(position), 0) + 1),     'Y',     CURRENT_TIMESTAMP,       ?
                                                                        FROM user_servers WHERE server_type_code = 'SERVER' and user_id = ?;

这是在交易中。

所以我的第一个问题是,因为我真的很难在 ecto 中找出正确的组合来完成这个查询。

如何在 Ecto 中执行带有 SELECT 子句的 INSERT 并能够用硬编码项替换问号。

我正在使用 snowflake 创建 ID,因此将在服务器端创建这些 ID 并通过它们发送。

我的下一个问题是,如何将 Repo.transaction 与 multi.new 与 Raw SQL 一起使用。

我相信您会想要使用原始 query/4 API。这将允许您编写自定义查询并获得无需转义输入的好处。像下面这样的东西应该可以工作。

raw_query = "INSERT INTO user_servers(user_id, server_id, server_type_code, position, active_flag, create_date, created_by)
             SELECT , , 'SERVER', (COALESCE(MAX(position), 0) + 1), 'Y', CURRENT_TIMESTAMP, 
             FROM user_servers WHERE server_type_code = 'SERVER' and user_id = ;"

Ecto.Adapters.SQL.query(MyRepo, raw_query, [value1, value2, value3, value4])