query migrations get_by etimologia and elixir ecto

elixir - migrations - Creando una restricción única en dos columnas juntas en Ecto



get_by elixir (3)

Puede crear un índice único en varias filas con

create unique_index(:some_table, [:col1, :col2])

Supongo que si desea tener claves compuestas, necesita usar execute/1 para ejecutar su SQL manualmente. Sin embargo, no estoy seguro de qué tan bien funcionan las teclas compuestas con Ecto, generalmente me quedo con la ID de serie estándar por tabla.

Si debería optar por el enfoque de clave compuesta, creo que las restricciones NOT NULL no son necesarias. La clave compuesta ya debe hacer cumplir que las columnas no son nulas.

¿Cómo crear un índice único en dos columnas en Ecto, que correspondería a esto:

CREATE TABLE someTable ( col1 int NOT NULL, col2 int NOT NULL, primary key (col1, col2) )

?


Un poco de seguimiento a la respuesta de Patrick.

Usar solo crear unique_index en su modelo finalmente lanzará una excepción en lugar de darle un error.

Para obtener un error, agregue una restricción en su conjunto de cambios, pero como parámetro puede dar el nombre del índice creado por unique_index.

Así que en su archivo de migración:

create unique_index(:your_table, [:col1, :col2], name: :your_index_name)

Luego en su conjunto de cambios:

def changeset(model, param // :empty) do model |> cast(params, @required_fields, @optional_fields) |> unique_constraint(:name_your_constraint, name: :your_index_name) end


unique_index no crearía una clave primaria compuesta como se muestra en el ejemplo de la pregunta. Crea una restricción única.

Si desea crear una clave principal compuesta (nota: no se recomienda cuando se trabaja con Ecto), hay más información aquí :

Migración:

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 ...

Esquema:

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 ...

unique_index embargo, en la mayoría de los casos, unique_index es lo que quieres.