使用Elixir - Ecto进行复杂查询

时间:2017-05-12 22:08:41

标签: mysql elixir phoenix-framework ecto

所以我正在将节点应用程序转换为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,并能够用硬编码项替换问号。

我正在使用雪花来创建ID,因此将在服务器端创建这些ID并将其发送出去。

我的下一个问题是,如何在带有Raw SQL的multi.new中使用Repo.transaction。

1 个答案:

答案 0 :(得分:3)

我相信您会想要使用原始query/4 API。这将允许您编写自定义查询,并且无需转义您的输入。以下内容应该有效。

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

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