Получить текущий идентификатор в 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