【问题标题】:Phoenix Ecto Unique Validation: constraint error when attempting to insert structPhoenix Ecto 唯一验证:尝试插入结构时出现约束错误
【发布时间】:2017-07-17 19:06:21
【问题描述】:

运行此迁移以便在帐号上有唯一索引

  def change do
    create unique_index(:users, [:account_number])
  end

然后在模型中:

def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:first_name, :last_name, :email, :phone, :city, :postal_code, :country, :login_count, :last_login, :active, :account_number, :password])
    |> validate_required([:first_name, :last_name, :email, :phone, :city, :postal_code, :country, :account_number])
    |> validate_length(:password, min: 8, max: 100)
    |> validate_format(:email, ~r/@/)
    |> unique_constraint(:email)
    |> unique_constraint(:account_number)
    |> put_pass_hash()
  end

产生这个错误:

 ** (Ecto.ConstraintError) constraint error when attempting to insert struct:

     * unique: users_account_number_index

 If you would like to convert this constraint into an error, please
 call unique_constraint/3 in your changeset and define the proper
 constraint name. The changeset has not defined any constraint.

PostgreSQL 9.6
凤凰 1.2.4
Ecto 2.1.4

我错过了什么?

【问题讨论】:

  • The changeset has not defined any constraint. 很奇怪。你确定这个changeset 函数在User 模型中并且你正在插入一个由这个函数返回的变更集吗?
  • 一切都编译好了?

标签: validation elixir phoenix-framework ecto


【解决方案1】:

您当前的代码正在使用 Ecto.Changeset.unique_constraint/2 该错误表明您应该使用Ecto.Changeset.unique_constraint/3,这意味着您必须添加选项。在这种情况下,只需使用 message 选项键添加约束错误消息

改变

|>unique_constraint(:account_number)

|>unique_constraint(:account_number, message: "Account number must be unique or some message like that")

【讨论】:

    【解决方案2】:

    这可能是因为您尝试插入现有的 :account 号码。 有两种方法可以解决它:

    1. 如果您需要保持这些字段的唯一性,请确保插入唯一的字段
    2. 否则,您可以从架构中删除 unique_constraint,并在数据库中创建非唯一索引,如下所示:
      def change do
        drop unique_index(:users, [:account_number])
        create index(:users, [:account_number])
      end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 2016-11-21
      • 2012-07-18
      相关资源
      最近更新 更多