运行 Ecto Seed 文件时出错
Getting error while running Ecto Seed file
我是 Phoenix Framework 和 Elixir 的新手。我正在尝试多次 运行 播种机功能。尽管它很好地或按预期填充数据,但它在执行时确实会抛出错误。
这是种子文件
alias FatLobster.Repo
alias FatLobster.Recipe
alias FatLobster.Place
alias FatLobster.Review
import Faker
defmodule RecurssionSeed do
def multiply_seeder(x,n)
when x <=n do
recipe_seed
place_seed
review_seed
x = x+1
multiply_seeder(x,n)
end
def recipe_seed do
Repo.insert(%Recipe{
recipe_title: Faker.Lorem.word ,
recipe_description: Faker.Lorem.paragraph ,
cover_img: Faker.Avatar.image_url() ,
picture_one: Faker.Avatar.image_url() ,
picture_two: Faker.Avatar.image_url() ,
picture_three: Faker.Avatar.image_url() ,
user_id: Enum.random(1..1000),
upvote_count: Enum.random(1..1000),
downvote_count: Enum.random(1..1000)
})
end
def place_seed do
Repo.insert(%Place{
places_title: Faker.Lorem.word,
places_description: Faker.Lorem.paragraph,
cover_img: Faker.Avatar.image_url(),
picture_one: Faker.Avatar.image_url(),
picture_two: Faker.Avatar.image_url(),
picture_three: Faker.Avatar.image_url(),
upvote_count: Enum.random(1..300),
downvote_count: Enum.random(1..1000)
})
end
def review_seed do
Repo.insert(%Review{
review_title: Faker.Lorem.word,
review_description: Faker.Lorem.sentence,
cover_img: Faker.Avatar.image_url,
picture_one: Faker.Avatar.image_url,
picture_two: Faker.Avatar.image_url,
picture_three: Faker.Avatar.image_url,
user_id: Enum.random(1..100),
upvote_count: Enum.random(1..1000),
downvote_count: Enum.random(1..250),
})
end
end
RecurssionSeed.multiply_seeder(1,25)
但是当我在终端中 运行 seed 命令时,它在填充 postgre 数据库后显示错误。
这是错误信息,
** (FunctionClauseError) no function clause matching in RecurssionSeed.multiply_seeder/2
priv/repo/seeds.exs:22: RecurssionSeed.multiply_seeder(26, 25)
(elixir) lib/code.ex:363: Code.require_file/2
(mix) lib/mix/tasks/run.ex:68: Mix.Tasks.Run.run/1
(mix) lib/mix/cli.ex:58: Mix.CLI.run_task/2
(elixir) lib/code.ex:363: Code.require_file/2
有人可以向我解释这里出了什么问题吗?
您需要添加终止条款:
def multiply_seeder(x,n) when x <= n do
...
end
def multiply_seeder(x,n), do: nil
您的函数目前永远不会终止。由于 n
是 25,当 x
达到 26 时,您会得到 FunctionClauseError
.
编辑
函数由它们的名称 (multiply_seeder
)、元数 (2
) 和保护子句组成。如果你调用一个函数但它没有匹配项,你将得到一个 FunctionClauseError
.
递归调用函数时,一个好的技巧是先编写终止子句。所以在这种情况下,当 x
> n
你想停止递归。所以你可以写:
def multiply_seeder(x, n) when x > n, do: nil
在这种情况下,当 x
> n
时,递归将停止。您现在可以将函数的主体放在 catch all 中(也称为 Pokémon 子句):
def multiply_seeder(x, n) when x > n, do: nil
def multiply_seeder(x,n) when x <=n do
recipe_seed
place_seed
review_seed
x = x+1
multiply_seeder(x,n)
end
请注意顺序很重要 - 匹配从上到下进行评估。
在这种情况下,您不需要手动实现递归函数。
您可以这样做:
Enum.each(1..25, fn _ ->
recipe_seed
place_seed
review_seed
end)
我是 Phoenix Framework 和 Elixir 的新手。我正在尝试多次 运行 播种机功能。尽管它很好地或按预期填充数据,但它在执行时确实会抛出错误。
这是种子文件
alias FatLobster.Repo
alias FatLobster.Recipe
alias FatLobster.Place
alias FatLobster.Review
import Faker
defmodule RecurssionSeed do
def multiply_seeder(x,n)
when x <=n do
recipe_seed
place_seed
review_seed
x = x+1
multiply_seeder(x,n)
end
def recipe_seed do
Repo.insert(%Recipe{
recipe_title: Faker.Lorem.word ,
recipe_description: Faker.Lorem.paragraph ,
cover_img: Faker.Avatar.image_url() ,
picture_one: Faker.Avatar.image_url() ,
picture_two: Faker.Avatar.image_url() ,
picture_three: Faker.Avatar.image_url() ,
user_id: Enum.random(1..1000),
upvote_count: Enum.random(1..1000),
downvote_count: Enum.random(1..1000)
})
end
def place_seed do
Repo.insert(%Place{
places_title: Faker.Lorem.word,
places_description: Faker.Lorem.paragraph,
cover_img: Faker.Avatar.image_url(),
picture_one: Faker.Avatar.image_url(),
picture_two: Faker.Avatar.image_url(),
picture_three: Faker.Avatar.image_url(),
upvote_count: Enum.random(1..300),
downvote_count: Enum.random(1..1000)
})
end
def review_seed do
Repo.insert(%Review{
review_title: Faker.Lorem.word,
review_description: Faker.Lorem.sentence,
cover_img: Faker.Avatar.image_url,
picture_one: Faker.Avatar.image_url,
picture_two: Faker.Avatar.image_url,
picture_three: Faker.Avatar.image_url,
user_id: Enum.random(1..100),
upvote_count: Enum.random(1..1000),
downvote_count: Enum.random(1..250),
})
end
end
RecurssionSeed.multiply_seeder(1,25)
但是当我在终端中 运行 seed 命令时,它在填充 postgre 数据库后显示错误。
这是错误信息,
** (FunctionClauseError) no function clause matching in RecurssionSeed.multiply_seeder/2
priv/repo/seeds.exs:22: RecurssionSeed.multiply_seeder(26, 25)
(elixir) lib/code.ex:363: Code.require_file/2
(mix) lib/mix/tasks/run.ex:68: Mix.Tasks.Run.run/1
(mix) lib/mix/cli.ex:58: Mix.CLI.run_task/2
(elixir) lib/code.ex:363: Code.require_file/2
有人可以向我解释这里出了什么问题吗?
您需要添加终止条款:
def multiply_seeder(x,n) when x <= n do
...
end
def multiply_seeder(x,n), do: nil
您的函数目前永远不会终止。由于 n
是 25,当 x
达到 26 时,您会得到 FunctionClauseError
.
编辑
函数由它们的名称 (multiply_seeder
)、元数 (2
) 和保护子句组成。如果你调用一个函数但它没有匹配项,你将得到一个 FunctionClauseError
.
递归调用函数时,一个好的技巧是先编写终止子句。所以在这种情况下,当 x
> n
你想停止递归。所以你可以写:
def multiply_seeder(x, n) when x > n, do: nil
在这种情况下,当 x
> n
时,递归将停止。您现在可以将函数的主体放在 catch all 中(也称为 Pokémon 子句):
def multiply_seeder(x, n) when x > n, do: nil
def multiply_seeder(x,n) when x <=n do
recipe_seed
place_seed
review_seed
x = x+1
multiply_seeder(x,n)
end
请注意顺序很重要 - 匹配从上到下进行评估。
在这种情况下,您不需要手动实现递归函数。
您可以这样做:
Enum.each(1..25, fn _ ->
recipe_seed
place_seed
review_seed
end)