在插入之前获取Postgres中的当前ID

时间:2016-09-14 01:33:45

标签: postgresql elixir ecto postgrex

我正在尝试哈希我在数据库中插入的每本书的当前ID,以便每本书都能被这些“代码”识别。

Ecto中是否有办法在变更集或Ecto.insert()中显示fragment("nextval('books_id_seq')")的值?

到目前为止,我所能做的就是从这个函数调用它来获取最后一个id:

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

我希望有更可靠的东西,比如插入查询中的片段。

1 个答案:

答案 0 :(得分:0)

有一种方法可以在同一个查询中获取ID: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