【问题标题】:Elixir Ecto custom primary keysElixir Ecto 自定义主键
【发布时间】:2020-06-20 17:49:31
【问题描述】:

我正在尝试将主键从 :id 重命名为 :account_id

我有以下Schema 和迁移。当我尝试插入记录时,我在 account_id 列上收到来自 Postgres 的“不能为空”错误。

我是否正确设置了自动生成位?我觉得应该在迁移中。

  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

【问题讨论】:

    标签: elixir ecto


    【解决方案1】:

    这在文档或其他指南中并不明显。诀窍是 :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
    

    【讨论】:

      【解决方案2】:

      你应该通过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)。

      【讨论】:

      • 应该 :account_id 是 :integer 类型,还是类型 :id?
      猜你喜欢
      • 1970-01-01
      • 2016-10-26
      • 2021-04-14
      • 2019-08-29
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多