我目前正在开发一个elixir项目,该项目从API解析XML并使用postgrex将数据插入到postgres中。
大多数插入工作正常,但对于奇数插入,我得到此错误。我见过很多其他人都面临这个错误,但我不确定如何在Elixir中解决它。
23:52:32.402 [error] Process #PID<0.224.0> raised an exception
** (KeyError) key :constraint not found in: %{code: :character_not_in_repertoire, file: "wchar.c", line: "2011", message: "invalid byte sequence for encoding \"UTF8\": 0xe3 0x83 0x22", pg_code: "22021", routine: "report_invalid_encoding", severity: "ERROR"}
(pipeline_processor) lib/worker.ex:133: PipelineProcessor.Worker.recursive_db_insert/1
(pipeline_processor) lib/worker.ex:47: PipelineProcessor.Worker.process_article/1
(pipeline_processor) lib/worker.ex:17: PipelineProcessor.Worker.request_article/0
我知道错误实际上是由于访问了地图的无效属性。但是我正试图解决postgrex给出的问题。
我的postgrex插入代码:
sql_string = "INSERT INTO articles (title, source, content) VALUES ($1, $2, $3) RETURNING id"
{:ok, pid} = Postgrex.Connection.start_link(Application.get_env(:pipeline_processor, :db_details))
response = Postgrex.Connection.query(
pid,
sql_string,
[article.title, article.source, article.content]
)
Postgrex.Connection.stop(pid)
Elixir中是否还有擦除无效字节以便这些插入成功?或者以某种方式让postgres处理它?</ p>
由于
答案 0 :(得分:1)
正如您已经猜到的那样,postgres抱怨您将无效的UTF8插入到文本类型中。我最初会尝试修复错误的编码,如果你不能这样做,你可以使用String.codepoints/1
和String.valid_character?/1
的组合来擦除或转义无效字节。