Copy & Paste Engineer

【Elixir】Ectoのプライマリーキーについて

【Elixir】Ectoのプライマリーキーについて

今回はEctoでプライマリーキーを扱うさまざまな方法についてのまとめです。

  1. デフォルトのプライマリーキー
  2. カスタムプライマリーキー
  3. プライマリーキーなし
  4. 複合プライマリーキー

デフォルトのプライマリーキー

デフォルトでは、Ectoは各スキーマに:idフィールドをプライマリーキーとして作成します。これは自動インクリメントの整数です。

defmodule MyApp.User do
  use Ecto.Schema
  # デフォルトでは、:idが自動的にプライマリーキーとして追加されます
  schema "users" do
    field :name, :string
  end
end

カスタムプライマリーキー

@primary_key 属性を使用してカスタムプライマリーキーを指定できます。

defmodule MyApp.User do
  use Ecto.Schema
  # :uuidが自動生成され、プライマリーキーとして使用されます
  @primary_key {:uuid, :binary_id, autogenerate: true}
  schema "users" do
    field :name, :string
  end
end

プライマリーキーなし

場合によっては、プライマリーキーがまったく不要な場合もあります。@primary_key falseを使用して無効にできます。

defmodule MyApp.Log do
  use Ecto.Schema
  # プライマリーキーは設定されません
  @primary_key false
  schema "logs" do
    field :message, :string
  end
end

複合プライマリーキー

Ectoは複合プライマリーキーもサポートしています。複数のフィールドをプライマリーキーとして指定できます。

defmodule MyApp.OrderItem do
  use Ecto.Schema
  # order_idとproduct_idが複合プライマリーキーとして設定されます
  @primary_key false
  schema "order_items" do
    field :order_id, :integer, primary_key: true
    field :product_id, :integer, primary_key: true
    field :quantity, :integer
  end
end

備考

公式ドキュメントによると、@primary_key@foreign_key_typeもスキーマ内で設定でき、これによりデフォルトのプライマリーキーと外部キーの型を変更できます。

Ecto.Schema