Phoenix/Ecto - 在种子文件中重新启动身份

Phoenix/Ecto - restart identity in seedfile

在 Phoenix 应用程序中使用种子文件时,如果种子多次 运行,是否可以重新启动 table 的身份?

例如,我目前正在使用以下种子:

PhoenixApp.Repo.delete_all PhoenixApp.Role
PhoenixApp.Repo.insert!(%PhoenixApp.Role{role: "admin"})
PhoenixApp.Repo.insert!(%PhoenixApp.Role{role: "non-admin"})

第一行清除table(这样如果种子多次运行,记录就不会堆积),接下来的几行创建种子记录。 运行 正如您通常所期望的那样,这段代码曾经会创建两条带有自动递增主键“1”和“2”的记录。但是,如果我稍后想在 table 中添加另一个条目,例如

PhoenixApp.Repo.insert!(%PhoenixApp.Role{role: "superuser"})

行的 ID 现在将为“3”、“4”和“5”,因为身份未重新启动。

Ecto 是否也有重新启动 table 身份的命令?我意识到我可以通过 IEx 向我的 table 添加额外的记录,但如果可能的话,我更愿意重新启动身份。

在 PostgreSQL 中,您可以执行 ALTER SEQUENCE <sequence name> RESTART 将序列的值重置为其原始值。 ID 主键的序列名称将为 #{table_name}_id_seq。您可以使用 Repo.query 运行 查询,例如:

Repo.query("ALTER SEQUENCE comments_id_seq RESTART")
iex(1)> Repo.insert!(%Comment{}).id
11
iex(2)> Repo.delete_all(Comment)
{11, nil}
iex(3)> Repo.insert!(%Comment{}).id
12
iex(4)> Repo.query("ALTER SEQUENCE comments_id_seq RESTART")
{:ok,
 %Postgrex.Result{columns: nil, command: :alter_sequence, connection_id: 3360,
  num_rows: 0, rows: nil}}
iex(5)> Repo.insert!(%Comment{}).id
1