Dan*_*ier 0 timestamp elixir ecto
当我尝试使用Ecto
以下方法在我的数据库中插入一行时:
sla = %MyMetrics.MonthlySLA{metric_name: "x", metric_type: "y", value: 43.33, metric_date: Date.new!(2020,1,1)}
MyMetrics.Repo.insert(sla)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
17:44:26.704 [debug] QUERY ERROR db=134.8ms queue=143.8ms idle=1397.2ms
INSERT INTO `monthly_slas` (`metric_date`,`metric_name`,`metric_type`,`value`) VALUES (?,?,?,?) [~D[2020-01-01], "x", "y", #Decimal<43.33>]
** (MyXQL.Error) (1364) (ER_NO_DEFAULT_FOR_FIELD) Field 'inserted_at' doesn't have a default value
(ecto_sql 3.5.3) lib/ecto/adapters/myxql.ex:241: Ecto.Adapters.MyXQL.insert/6
(ecto 3.5.5) lib/ecto/repo/schema.ex:649: Ecto.Repo.Schema.apply/4
(ecto 3.5.5) lib/ecto/repo/schema.ex:262: anonymous fn/15 in Ecto.Repo.Schema.do_insert/4
Run Code Online (Sandbox Code Playgroud)
我的Ecto
模型。
defmodule MyMetrics.MonthlySLA do
use Ecto.Schema
import Ecto.Changeset
schema "monthly_slas" do
field :metric_name, :string
field :metric_type, :string
field :metric_date, :date
field :value, :decimal
end
def changeset(monthly_sla, params \\ %{}) do
monthly_sla
|> Ecto.Changeset.cast(params, [:metric_name, :metric_type, :metric_date, :value])
|> Ecto.Changeset.validate_required([:metric_name, :metric_type, :metric_date, :value])
end
end
Run Code Online (Sandbox Code Playgroud)
和我的迁移定义:
defmodule MyMetrics.Repo.Migrations.CreateMonthlySla do
use Ecto.Migration
def change do
create table(:monthly_slas) do
add :metric_name, :string, null: false
add :metric_type, :string, null: false
add :metric_date, :date, null: false
add :value, :decimal, precision: 10, scale: 2, null: false
timestamps()
end
create unique_index(:monthly_slas, [:metric_name, :metric_date])
create unique_index(:monthly_slas, [:metric_date, :metric_name])
create unique_index(:monthly_slas, [:metric_type, :metric_name, :metric_date])
create unique_index(:monthly_slas, [:metric_date, :metric_type, :metric_name])
end
end
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
您需要添加timestamps()
到您的 Ecto 模型中。您的迁移定义了inserted_at
和updated_at
字段的架构,但您的代码需要在将模型插入到表中时提供这些字段。这就是timestamps()
宏的用途。
defmodule MyMetrics.MonthlySLA do
use Ecto.Schema
import Ecto.Changeset
schema "monthly_slas" do
field :metric_name, :string
field :metric_type, :string
field :metric_date, :date
field :value, :decimal
# Add this
timestamps()
end
def changeset(monthly_sla, params \\ %{}) do
monthly_sla
|> Ecto.Changeset.cast(params, [:metric_name, :metric_type, :metric_date, :value])
|> Ecto.Changeset.validate_required([:metric_name, :metric_type, :metric_date, :value])
end
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
325 次 |
最近记录: |