我正在尝试对原始 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
您可以通过数据库适配器发出原始 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"]
]
}