在 Elixir 中测试原始 SQL 查询

问题描述 投票:0回答:1

我正在尝试对原始 SQL 查询进行单元测试,但没有得到任何结果。我的测试做了一些插入,例如:

Repo.insert!(%Inquiry{<fields>})

我的查询选择部分会将日期时间截断为日期和其他一些内容,这就是为什么我将其设置为原始查询,但在尝试使其工作时,我只是将其简化为如下所示:

query = "SELECT * FROM inquiries"
results = Ecto.Adapters.SQL.query(Repo, query, [])

在我的测试中,这不会返回任何行,但以下命令会返回任何行:

Repo.all(Inquiry)

我尝试设置共享连接,但不起作用。让它发挥作用有什么秘诀吗?

setup do
  :ok = Ecto.Adapters.SQL.Sandbox.checkout(Repo)
  Ecto.Adapters.SQL.Sandbox.mode(Repo, {:shared, self()})
end
elixir ecto
1个回答
0
投票

您可以通过数据库适配器发出原始 SQL 查询(对于 PostGreSQL 最常见的是

Ecto.Adapters.SQL
)。例如:

query = """
  SELECT id, name, inserted_at
  FROM users
  UNION
    SELECT id, name, inserted_at
    FROM customers
    WHERE name = $1
"""

Ecto.Adapters.SQL.query!(MyApp.Repo, query, ["Carol"])

如果您没有任何位置绑定变量(例如

$1
),则第三个参数可以是空列表
[]

要测试这些查询,您应该能够在 SQL 编辑器中手动执行它们。

请注意,结果的形状与通过常规 Ecto 查询得到的结果不同。示例结果可能如下所示

%Postgrex.Result{
  columns: ["foo"],
  command: :select,
  connection_id: 22172,
  messages: [],
  num_rows: 2,
  rows: [
    ["10.5240/C895-1116-F0F4-68A3-FEDC-2"],
    ["10.5240/5063-763E-052E-BF58-693C-5"]
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.