insert_all 不会使用 ecto 2.0 创建自动生成的 inserted_at
insert_all does not create auto generated inserted_at with ecto 2.0
# 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: "Whosebug", url: "whosebug.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, Whosebug, whosebug.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_at
和 updated_at
列。迁移中有一个同名函数。
您可以使用以下方法在数据库级别进行设置:
alter table(:categories) do
modify :inserted_at, :utc_datetime, default: fragment("NOW()")
end
或者您可以在地图中设置:
categories = [%{name: "Whosebug", url: "whosebug.com", inserted_at: Ecto.DateTime.utc}]
无论您选择哪种解决方案,您都可能需要对 updated_at
执行相同的操作。
如果您不想跟踪时间戳,那么您可以从架构中删除 timestamps
并删除迁移中的列(或者如果您尚未将迁移提交到版本控制,只需删除timestamps
函数)。
... timestamps, won’t be autogenerated when using insert_all/3
. This
is by design as this function aims to be a more direct way to insert
data into the database without the conveniences of insert/2
..
# 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: "Whosebug", url: "whosebug.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, Whosebug, whosebug.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_at
和 updated_at
列。迁移中有一个同名函数。
您可以使用以下方法在数据库级别进行设置:
alter table(:categories) do
modify :inserted_at, :utc_datetime, default: fragment("NOW()")
end
或者您可以在地图中设置:
categories = [%{name: "Whosebug", url: "whosebug.com", inserted_at: Ecto.DateTime.utc}]
无论您选择哪种解决方案,您都可能需要对 updated_at
执行相同的操作。
如果您不想跟踪时间戳,那么您可以从架构中删除 timestamps
并删除迁移中的列(或者如果您尚未将迁移提交到版本控制,只需删除timestamps
函数)。
... timestamps, won’t be autogenerated when using
insert_all/3
. This is by design as this function aims to be a more direct way to insert data into the database without the conveniences ofinsert/2
..