1.1.4"}, {:postgrex, ">= 0.0.0"}, {:phoenix-6ren">
gpt4 book ai didi

elixir - insert_all不会使用ecto 2.0创建自动生成的insert_at

转载 作者:行者123 更新时间:2023-12-04 05:29:26 25 4
gpt4 key购买 nike

# mix.exs
defp deps do
[{:phoenix, "~> 1.1.4"},
{:postgrex, ">= 0.0.0"},
{:phoenix_ecto, "~> 3.0.0-rc"},
{:gettext, "~> 0.9"},
...
]
end

已安装的ecto版本为 "2.0.0-rc.5"
iex(1)> categories = [%{name: "stackoverflow", url: "stackoverflow.com"}]

iex(2)> App.Repo.insert_all App.Category, categories

** (Postgrex.Error) ERROR (not_null_violation): null value in column "inserted_at" violates not-null constraint

table: categories
column: inserted_at

Failing row contains (1, stackoverflow, stackoverflow.com, null, null).
(ecto) lib/ecto/adapters/sql.ex:176: Ecto.Adapters.SQL.query!/5
(ecto) lib/ecto/adapters/sql.ex:350: Ecto.Adapters.SQL.insert_all/8
(ecto) lib/ecto/repo/schema.ex:42: Ecto.Repo.Schema.do_insert_all/6
iex(2)>

从文档看来, inserted_at是自动生成的。我是否必须手动执行此部分?
schema "categories" do
field :name, :string
field :url, :string

timestamps
end

最佳答案

Ecto.Schema.timestamps/1函数定义inserted_atupdated_at列。迁移中有一个同名的函数。
您可以使用以下方法在数据库级别进行设置:

alter table(:categories) do
modify :inserted_at, :utc_datetime, default: fragment("NOW()")
end
或者,您可以在 map 中进行设置:
categories = [%{name: "stackoverflow", url: "stackoverflow.com", inserted_at: Ecto.DateTime.utc}]
无论选择哪种解决方案,您都可能必须对 updated_at做同样的事情。
如果您不想跟踪时间戳,则可以从架构中删除 timestamps并在迁移中删除列(或者,如果您尚未将迁移提交到版本控制,只需删除 timestamps函数)。

关于elixir - insert_all不会使用ecto 2.0创建自动生成的insert_at,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37537094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com