【问题标题】:Using Elixir - Ecto for complex queries使用 Elixir - Ecto 进行复杂查询
【发布时间】:2017-05-12 22:08:40
【问题描述】:

所以我正在将节点应用程序转换为 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 并发送它们。

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

【问题讨论】:

    标签: mysql elixir phoenix-framework ecto


    【解决方案1】:

    我相信您会想要使用原始的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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多