Эликсир Экто настраиваемые первичные ключи - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь переименовать первичный ключ с :id на :account_id.

У меня есть следующие Schema и миграция. Когда я пытаюсь вставить запись, я получаю ошибку «не может быть пустым» из Postgres в столбце account_id.

Правильно ли я установил бит автогенерации? Я чувствую, что это должно быть в миграции.

  def change do
    create table(:accounts) do
      add :account_id, :integer, primary_key: true
      add :email, :string
      timestamps()
    end
  end


  @primary_key {:account_id, :id, autogenerate: true}
  schema "accounts" do
    field :email, :string
    timestamps()
  end

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Вы должны передать primary_key: false параметр:

  def change do
    create table(:accounts, primary_key: false) do
      add :account_id, :integer, primary_key: true
      add :email, :string
      timestamps()
    end
  end

[Редактировать]

Поскольку сам спрашивающий написал в своем ответе, мы можем использовать :bigserial вместо :integer здесь .

:bigserial занимает 8 байтов, а :integer занимает 4 байта.

В Ecto 2.0 (выпущено в 2016 году) тип первичных ключей по умолчанию - :bigserial, но мы можем смело используйте :integer для обычных целей, так как он все еще очень большой (от 1 до 2 147 483 647).

0 голосов
/ 08 марта 2020

Это не очевидно из документов или других руководств. Трюк относится к типу :bigserial для поля :id.

  def change do
    create table(:accounts, primary_key: false) do
      add :account_id, :bigserial, primary_key: true
      add :email, :string
      timestamps()
    end
  end
...