2017-04-10 10 views
0

シードファイルをPhoenixアプリケーションで使用する場合、シードを複数回実行するとテーブルのIDを再起動できますか? (種子が複数回実行された場合、レコードは積み上げないように)Phoenix/Ecto - シードファイルのアイデンティティを再起動

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

最初の行はテーブルをクリアし、そして:

例えば、私は現在、以下の種子で働いています次の行はシードレコードを作成します。このコードを一度実行すると、通常のように、自動増分された主キー '1'と '2'を持つ2つのレコードが作成されます。アイデンティティがなかったのでしかし、私は、このような

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

として、後でテーブルに別のエントリを追加したい場合は、行のIDが今、「3」、「4」、および「5」になります再開されました。

EctoにはテーブルIDも再起動するコマンドがありますか?可能であれば、IExを使用してテーブルにレコードを追加することができますが、IDを再起動することをお勧めします。

答えて

2

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 
+0

おかげで再び、@Dogbertを! – skwidbreth