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