Получить текущий идентификатор в Postgres перед вставкой

Я пытаюсь хэшировать текущий идентификатор каждой книги, которую я вставляю в базу данных, чтобы каждая книга распознавалась по такому "коду".

Есть ли способ в Экто показать значение fragment("nextval('books_id_seq')") в ревизии или Ecto.insert()?

Пока все, что я могу сделать, это получить последний идентификатор, вызвав его из этой функции:

...
  def get_currval() do
    from(b in Book,
      select: fragment("nextval('books_id_seq')"),
      limit: 1
    )
    |> Repo.one
  end

Я хотел бы иметь что-то более надежное, например фрагмент в запросе вставки.

1 ответ

Существует способ вернуть идентификатор в том же запросе: RETURNING, который позволяет вам

# \d+ tmp_play
                                                  Table "pg_temp_11.tmp_play"
 Column |         Type          |                       Modifiers                       | Storage  | Stats target | Description 
--------+-----------------------+-------------------------------------------------------+----------+--------------+-------------
 id     | integer               | not null default nextval('tmp_play_id_seq'::regclass) | plain    |              | 
 name   | character varying(32) |                                                       | extended |              | 
Indexes:
    "tmp_play_pkey" PRIMARY KEY, btree (id)

# INSERT INTO tmp_play (name) VALUES ('Hello') RETURNING id;
 id 
----
  1
(1 row)

INSERT 0 1

# INSERT INTO tmp_play (name) VALUES ('world') RETURNING id;
 id 
----
  2
(1 row)

INSERT 0 1
Другие вопросы по тегам