使用 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
这是可能的解决方案。
- 您需要传递一个带有要更新的 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
我需要更新,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
这是可能的解决方案。
- 您需要传递一个带有要更新的 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