使用 Ecto 更新 Elixir 中的记录

Update record in Elixir using Ecto

我需要更新,table 1 主键为 table2,

表 1 = Redis_server 表 2 = User_server

代码

def update_redis_server(redis_server, user) do

    params = %{"id" => redis_server.id, "user_id" => user.id }
    %RedisServer{}
    |> Repo.preload([:user])
    |> RedisServer.changeset(params)
    |> IO.inspect
    |> Repo.update()


  end

支持文本

1. ChangeSet Inspect
AAK.POS.HelperFunction.update_redis_server(redis_server, user)
#Ecto.Changeset<
  action: nil,
  changes: %{user_id: "3b7b8166-d474-410f-bf9f-c3910734e197"},
  errors: [],
  data: #AAK.Cache.RedisServer<>,
  valid?: true
>

样本数据库数据

id                                      server_url                   user_id
"685af94f-f794-4a77-9bb8-4a217b9fba1b"  "redis://localhost:59443/2"  nil    
"ec00e240-e91f-4835-a0f0-f9103fd39d3b"  "redis://localhost:6379/2"  nil 
"2b451a2c-c749-4ae2-9d19-5fec1c1bfee4"  "redis://localhost:59445/2"  nil    

错误

** (Ecto.NoPrimaryKeyValueError) struct `%AAK.Cache.RedisServer{__meta__: #Ecto.Schema.Metadata<:built, "redis_servers">, id: nil, inserted_at: nil, server_url: nil, updated_at: nil, user: nil, user_id: nil}` is missing primary key value
    (ecto 3.7.1) lib/ecto/repo/schema.ex:967: anonymous fn/3 in Ecto.Repo.Schema.add_pk_filter!/2
    (elixir 1.11.1) lib/enum.ex:2181: Enum."-reduce/3-lists^foldl/2-0-"/3
    (ecto 3.7.1) lib/ecto/repo/schema.ex:414: Ecto.Repo.Schema.do_update/4

这是可能的解决方案。

  1. 您需要传递一个带有要更新的 ID 的结构
  def update_redis_server(redis_server, user) do

    params = %{"user_id" => user.id }
    %RedisServer{id:  redis_server.id}
    |> RedisServer.changeset(params)
    |> IO.inspect
    |> Repo.update()


  end