birlikte iki sütun üzerinde benzersiz bir kısıtlama oluşturma?bu karşılık olur Ecto iki sütunun üzerinde benzersiz bir dizin, nasıl oluştururum Ecto
cevap
A Little sonuçta size bir hata vermek yerine bir istisna durumu sadece modeline unique_index oluşturmak kullanma Patrick cevap
takip.
Hata almak için, değişiklik kümenizde bir kısıtlama ekleyin, ancak bir paremeter olarak, unique_index tarafından oluşturulan dizin adını verebilirsiniz. Taşıma dosyasında Yani
: En Değişiklik listesi Sonra
create unique_index(:your_table, [:col1, :col2], name: :your_index_name)
: Sorunun örnekte görüldüğü gibi
def changeset(model, param \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
|> unique_constraint(:name_your_constraint, name: :your_index_name)
end
Sen kompozit anahtarlara sahip isterseniz herhalde
create unique_index(:some_table, [:col1, :col2])
ile birden fazla satıra benzersiz bir dizin oluşturabilir, el SQL çalıştırmak için execute/1
kullanmak gerekir. Kompozit tuşların Ecto ile ne kadar iyi çalıştığından emin değilim, genellikle sadece tablo başına standart seri kimliğiyle uğraşırım.
Bileşik anahtar yaklaşımıyla devam ederseniz, NOT NULL
kısıtlamalarının gerekli olmadığını düşünüyorum. Bileşik anahtar, sütunların boş olmadığından zaten zorlamalıdır.
unique_index
bileşik birincil anahtar oluşturun ederim. Benzersiz bir kısıtlama yaratıyor. Eğer bir bileşik birincil anahtar oluşturmak istiyor yoksa
(not: önerilmez Ecto ile çalışıldığında), there's more information here:
Göç:
defmodule HelloPhoenix.Repo.Migrations.CreatePlayer do
use Ecto.Migration
def change do
create table(:players, primary_key: false) do
add :first_name, :string, primary_key: true
add :last_name, :string, primary_key: true
add :position, :string
add :number, :integer
...
Şema:
defmodule HelloPhoenix.Player do
use Ecto.Schema
@primary_key false
schema "players" do
field :first_name, :string, primary_key: true
field :last_name, :string, primary_key: true
field :position, :string
field :number, :integer
...
Çoğu durumda, unique_index
istediğiniz gibi.
Bu, kabul edilen yanıt imo olarak işaretlenmelidir. @ TheSquad, does: name_your_constraint: col1 veya: col2 bu bağlamda olması gerekir? Referans: https://hexdocs.pm/ecto/Ecto.Changeset.html#unique_constraint/3 – Olshansk
kesinlikle değil, kısıtlama karşılanmadığında kapsamlı bir hata mesajı almak istediğiniz herhangi bir atomu koyabilirsiniz – TheSquad