Database auto increment field not set in changeset

The changeset returned by Repo.insert does not include db-generated non primary field, in my case I defined an auto-increment field with type integer in schema:

schema "link" do
    field :sequence, :integer, read_after_write: true
    field :url, :string
    field :code, :string

    timestamps()
end

and make it a bigserial in migration:

def change do
    create table(:link, primary_key: false) do
      add :id, :binary_id, primary_key: true
      add :sequence, :bigserial, null: false
      add :url, :string
      add :code, :string

      timestamps()
    end
  end

sequence accessed in a transaction

Ecto.Multi.new()
|> Ecto.Multi.insert(
     :link,
     Link.changeset(%Link{}, attrs)
   )
|> Ecto.Multi.run(
     :update,
     fn repo, %{link: link} ->
       link
       |> Ecto.Changeset.change(code: generate(link.sequence))
       |> repo.update()
     end
   )
|> Repo.transaction()

I tried :read_after_writes option mentioned in this issue , not work for me, any suggestion?

postgresql as db

1 Like

You have read_after_write not read_after_writes, try the latter and see if that helps.

3 Likes

Thanks, it works now