JavaScriptを有効にしてください

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

 ·  ☕ 2 分で読めます

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
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を使用して無効にできます。

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

複合プライマリーキー

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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

備考

  • キーの自動生成: Ectoは、整数だけでなくUUIDのキーも自動生成できます。
  • 外部キー: スキーマ間の関係を定義する際、参照先のスキーマのプライマリーキーでなくてもよい外部キーを指定できます。

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

Ecto.Schema

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer