You need to enable JavaScript to run this app. Phoenix/Elixir从CSV初始化数据库出现FunctionClauseError如何修复
优惠活动
大模型
产品
解决方案
定价
更多

Phoenix/Elixir从CSV初始化数据库出现FunctionClauseError如何修复

问题修复方案

错误原因

CSV.decode处理CSV行数据时,会返回两种格式的结果:成功时返回{:ok, map},行格式不符合预期时返回{:error, 错误信息}。你当前代码的匿名函数仅匹配了成功场景的返回值,遇到错误行时没有对应的函数子句处理,因此触发FunctionClauseError。

修复方法

修改Enum.each的匿名函数,增加错误分支的匹配逻辑,你可以根据自身需求选择打印错误后跳过异常行,或者终止执行定位问题。建议同时增加行号打印,方便快速定位CSV中存在问题的行。

修复后完整代码(带错误行定位)

alias FlightsList.Repo
alias FlightsList.Management.Flights

File.stream!("C:/Users/vukap/phx_projects/flights_list/priv/repo/flights.csv")
|> Stream.drop(1)
|> CSV.decode(headers: [:Id, :Origin, :Destination, :DepartureDate, :DepartureTime, :ArrivalDate, :ArrivalTime, :Number])
|> Stream.with_index(2) # 已跳过表头,行号从第2行开始计数
|> Enum.each(fn 
  {{:ok, map}, _line_num} ->
    Flights.changeset(
      %Flights{},
      %{Id: String.to_integer(map[:Id]), Origin: map[:Origin], Destination: map[:Destination], DepartureDate: String.to_integer(map[:DepartureDate]), DepartureTime: String.to_integer(map[:DepartureTime]), ArrivalDate: String.to_integer(map[:ArrivalDate]), ArrivalTime: String.to_integer(map[:ArrivalTime]), Number: map[:Number]})
    |> Repo.insert!()
  {{:error, reason}, line_num} ->
    IO.puts("处理CSV第#{line_num}行失败: #{inspect(reason)}")
    # 如果需要遇到错误直接终止执行,取消下面这行注释即可
    # raise "CSV行格式错误"
end)

内容的提问来源于stack exchange,提问作者andriyenkoa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 22:06:05