所以我正在将节点应用程序转换为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。
答案 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])