运行Ecto Seed文件时出错

时间:2016-04-23 17:36:24

标签: postgresql elixir phoenix-framework ecto elixir-framework

我是Phoenix Framework和Elixir的新手。我试图多次运行播种机功能。虽然它可以很好地填充数据或按预期填充数据,但它确实会在执行时抛出错误。

这是种子文件

function print (value) {
  console.log(math.format(value));
}

但是当我在终端中运行种子命令时,它会在填充postgre数据库后显示错误。

这是错误消息,

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)

有人可以向我解释这里出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

您需要添加终止条款:

 def multiply_seeder(x,n) when x <= n do
 ...
 end
 def multiply_seeder(x,n), do: nil

您的功能目前永不终止。由于n为25,当x达到26时,您会获得FunctionClauseError

修改

函数由其名称(multiply_seeder)及其arity(2)及其保护条款组成。如果您调用某个函数但没有匹配项,则会得到FunctionClauseError

当递归调用函数时,一种好的方法是首先编写终止子句。所以在这种情况下,当x&gt; n你要停止递归。所以你可以写:

def multiply_seeder(x, n) when x > n, do: nil

在这种情况下,当x&gt; 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)