【发布时间】:2021-05-18 16:08:04
【问题描述】:
我是 elixir/ecto 的新手,我不明白为什么我的 error_data 字段(在架构中定义为 :binary)在我的 postgresql 列中插入斜杠转义:
params = %{error_data: "eyJtZXNzYWdlIjoiSW52YWxpZCB0b2tlbiIsImNhdXNlIjpbXSwiZXJyb3IiOiJub3RfZm91bmQiLCJzdGF0dXMiOjQwMX0="}
cast(%{}, params, [:error_data])
|> change(%{error_data: Base.decode64!(params.error_data)})
|> Ecto.Repo.insert()
根据@smathy 洞察,我在change 和insert 调用之间添加了IO.puts(get_change(changeset, :error_data)。它显示数据已被解码并且在插入之前没有斜线转义。但是显示 Ecto 查询的下一行被转义了...检查我的应用程序的输出:
[info] Creating error for 1 on channel 1
{"message":"Invalid token","cause":[],"error":"not_found","status":401}
[debug] QUERY OK db=0.5ms
INSERT INTO "errors" ("code","error","error_message","http_status","id","channel_id","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7,$8) RETURNING "id" ["error-03", "{\"message\":\"Invalid token\",\"cause\":[],\"error\":\"not_found\",\"status\":401}", "Invalid token", 401, 1, 1, ~N[2021-02-16 12:24:58], ~N[2021-02-16 12:24:58]]
然后检查这些数据库查询:第一个是代码插入错误。最后一个来自手动插入的未转义错误:
dev=# SELECT error FROM errors ORDER BY updated_at DESC limit 1;
error
---------------------------------------------------------------------------------------
"{\"message\":\"Invalid token\",\"cause\":[],\"error\":\"not_found\",\"status\":401}"
(1 row)
dev=# SELECT error FROM errors ORDER BY updated_at ASC limit 1;
error
---------------------
{"eita": "deu pau"}
(1 row)
如何避免转义并插入纯解码 ({"message":"Invalid token","cause":[],"error":"not_found","status":401}) 内容?
如果我可以在插入中使用 ecto 片段,我会告诉数据库解码 base64 字符串......我也没有找到如何做到这一点......有什么帮助吗?
我想知道是否有任何环境配置会影响 ECTO,以便记录它的查询并最终导致字符串转换/转义 error_data 二进制文件...
【问题讨论】:
标签: string postgresql base64 elixir ecto