标签: ecto

无法在匹配内调用远程函数:Foreach循环

我试图在for-each循环中设置User模型的一些属性,但是我一直在跟踪错误

无法调用远程函数x.token/0匹配 (elixir)src/elixir_fn.erl:9:匿名fn/3 in:elixir_fn.translate/3(stdlib)lists.erl:1353 :: lists.mapfoldl/3(elixir) )src/elixir_fn.erl:14 :: elixir_fn.translate/3

方法:

Enum.each(users, fn(user) ->
  user.token = Comeonin.Bcrypt.hashpwsalt(to_string(user.id))
end)
Run Code Online (Sandbox Code Playgroud)

elixir ecto

9
推荐指数
1
解决办法
7903
查看次数

协议Ecto.Queryable未实现

我正在尝试将Guardian实现到我的API中并通过它执行登录以获得JWT.我正在看的教程就在这里.问题是使用类似于他们在示例中使用的用户模型实现登录.Model代码如下所示:

defmodule PushflightServer.User do
  use PushflightServer.Web, :model

use Ecto.Repo
import Ecto.Query
  alias PushflightServer.Repo

  schema "users" do
    field :name, :string
    field :email, :string
    field :encrypted_password, :string
    field :password, :string, virtual: true
    field :verify_token, :string
    field :verify_date, Ecto.DateTime

    timestamps
  end

  def from_email(nil), do: { :error, :not_found }
  def from_email(email) do
    IO.write("Before email")
    IO.inspect(email)
    Repo.one(User, email: email)
  end
Run Code Online (Sandbox Code Playgroud)

如果我从Phoenix内部或直接在iex -S mix调用from_email,我会收到以下错误:

user = PushflightServer.User.from_email("rob@json.com")

**(Protocol.UndefinedError)协议Ecto.Queryable没有为User实现,给定的模块不存在(ecto)lib/ecto/queryable.ex:33:Ecto.Queryable.Atom.to_query/1(ecto)lib/ecto /repo/queryable.ex:90:Ecto.Repo.Queryable.execute/5(ecto)lib/ecto/repo/queryable.ex:15:Ecto.Repo.Queryable.all/4(ecto)lib/ecto/repo /queryable.ex:44:Ecto.Repo.Queryable.one/4

我必须遗漏一些简单的东西,但我无法找到有关为什么会发生这种情况的任何文档.使用Repo插入数据工作正常.有任何想法吗?

elixir ecto phoenix-framework

9
推荐指数
1
解决办法
8511
查看次数

如何在将Ecto变更集插入仓库之前修改它?

我是凤凰城/ Elixir的新手,我正试图围绕变革集团.

我知道它包含一组用于创建或更新模型的更改.

我想知道的是,在将更改推送到数据库之前,是否以及如何修改更改.

我的用例如下:

  • 我有一个表单,允许人们在数据库中创建新的艺术家.
  • 在这种形式中有一个专业领域.
  • 在创建艺术家之前,我想用","将专业字段拆分为一个字符串数组

由于不变性约束,我甚至不确定是否可以直接修改变更集,但我可以创建另一个变更集以插入仓库.

欢迎任何建议,并毫不犹豫地指出我可能正在做的不良做法或愚蠢的事情!

编辑以下评论:我正在寻找类似的东西:

defp put_specialty_array(changeset) do
  case changeset do
    %Ecto.Changeset{valid?: true, changes: %{specialty: spec}} ->
      put_change(changeset, :specialty, String.split(spec, ","))
    _ ->
      changeset
  end
end
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

9
推荐指数
1
解决办法
4258
查看次数

在没有Ecto的情况下使用Phoenix Framework

我正在开发一个带有由Phoenix支持的Web界面的应用程序,我正在探索当前SQLite(及其Ecto驱动程序)的替代存储方法(是的,我听说过PGSQL,不,我不愿意使用它.)

我想使用LevelDB和H2LevelDB,它在Github上有一个Erlang驱动程序

然而,在编译时我意识到Phoenix似乎很依赖Ecto,即使在负责渲染eex模板的模块中也是如此.我发现有点可怕,有点奇怪,同时有点烦人.那么,从预先生成的文件中盲目地清除对Ecto的所有引用是否安全,或者我应该为我的Web UI切换到其他内容?

elixir leveldb ecto phoenix-framework

9
推荐指数
1
解决办法
4258
查看次数

尝试创建数据库时出错 - Ecto - Phoenix

我在尝试创建数据库时遇到错误.我安装了postgres,我已经成功完成了一些测试项目.而且,我没有看到这个错误.任何帮助都会很棒:

错误:

 ~/Desktop/elixir/restore $ mix ecto.create
** (Mix) The database for Restore.Repo couldn't be created: tcp connect: connection refused - :econnrefused

21:52:23.978 [error] GenServer #PID<0.150.0> terminating
** (Postgrex.Error) tcp connect: connection refused - :econnrefused
    (db_connection) lib/db_connection/connection.ex:148: DBConnection.Connection.connect/2
    (connection) lib/connection.ex:623: Connection.enter_connect/5
    (stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
Last message: nil
State: Postgrex.Protocol
Run Code Online (Sandbox Code Playgroud)

postgresql elixir ecto phoenix-framework

9
推荐指数
2
解决办法
3263
查看次数

Elixir和Ecto中的DateTime.now

我想在没有第三方库的情况下获得Phoenix/Elixir的当前日期时间戳.或者简单地说,我想要类似的东西DateTime.now().我怎样才能做到这一点?

elixir ecto phoenix-framework

9
推荐指数
2
解决办法
7040
查看次数

使用Ecto的递归CTE

如何在我计划与Ecto一起运行的查询中使用递归CTE的结果?例如,假设我有一个表,节点,结构如下:

-- nodes table example --

id  parent_id
1   NULL
2   1
3   1
4   1
5   2
6   2
7   3
8   5
Run Code Online (Sandbox Code Playgroud)

我还有另一个表nodes_users结构如下:

-- nodes_users table example --

node_id   user_id
1         1
2         2
3         3
5         4
Run Code Online (Sandbox Code Playgroud)

现在,我想抓住具有特定节点或其上方节点的所有用户,为了示例,我们选择具有id 8的节点.

我可以使用以下递归查询来执行此操作:

WITH RECURSIVE nodes_tree AS (
    SELECT *
    FROM nodes
    WHERE nodes.id = 8
UNION ALL
    SELECT n.*
    FROM nodes n
    INNER JOIN nodes_tree nt ON nt.parent_id = n.id
)
SELECT u.* FROM users u
INNER …
Run Code Online (Sandbox Code Playgroud)

postgresql elixir recursive-cte ecto phoenix-framework

9
推荐指数
1
解决办法
1492
查看次数

具有可变arity的Ecto查询和自定义MySQL函数

我想执行如下查询:

SELECT id, name
FROM mytable
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')
Run Code Online (Sandbox Code Playgroud)

FIELD是MySQL特定的函数,'B', 'A', 'D', 'E', 'C'是来自List的值.

我尝试使用片段,但它似乎不允许仅在运行时中知道动态arity.

除了使用完全原始使用Ecto.Adapters.SQL.query,有没有办法使用Ecto的查询DSL处理这个?

编辑:这是第一个天真的方法,当然不起作用:

ids = [2, 1, 3] # this list is of course created dynamically and does not always have three items
query = MyModel
        |> where([a], a.id in ^ids)
        |> order_by(fragment("FIELD(id, ?)", ^ids))
Run Code Online (Sandbox Code Playgroud)

mysql elixir arity ecto

9
推荐指数
1
解决办法
861
查看次数

Elixir Ecto:如何使用belongs_to和has_many编写迁移?

我有两个型号,Person并且Pet,我希望Person能够有很多宠物,但Pet属于只有一个人:

defmodule MyApp.Person do
  use MyApp.Web, :model

  alias MyApp.Pet

  schema "persons" do
    field :name, :string
    has_many :pets, Pet
    timestamps()
  end

  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [])
    |> validate_required([])
  end
end
Run Code Online (Sandbox Code Playgroud)

defmodule MyApp.Pet do
  use MyApp.Web, :model

  alias MyApp.Person

  schema "pets" do
    field :name, :string
    belongs_to :person, Person
    timestamps()
  end

  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [])
    |> validate_required([]) …
Run Code Online (Sandbox Code Playgroud)

postgresql elixir ecto phoenix-framework

9
推荐指数
1
解决办法
1903
查看次数

Ecto - 无法删除自定义命名的唯一索引

我无法成功运行 Ecto 迁移来删除唯一索引,该索引在最初创建时已提供:name属性的唯一索引(以便不使用默认索引名称)。但是,我现在无法删除该索引,因为 Ecto 似乎正在尝试查找名称不正确的索引(尽管我已经提供了它)。

唯一索引最初是通过迁移创建的,如下所示:

def change do
  create(
    unique_index("foo", [:bar_id],
      where: "rejected IS NULL AND accepted IS NULL)",
      name: :bar_pending_index
    )
  )
end
Run Code Online (Sandbox Code Playgroud)

当我检查 psql shell 中的表时,我看到该索引列出为:

"bar_pending_index" UNIQUE, btree (bar_id) WHERE rejected IS NULL AND accepted IS NULL
Run Code Online (Sandbox Code Playgroud)

为了删除索引,我编写了以下迁移:

def up do
  drop index("foo", [:bar_pending_index])
end

def down do
  create(
    unique_index("foo", [:bar_id],
      where: "rejected IS NULL AND accepted IS NULL)",
      name: :bar_pending_index
    )
  )
end
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行此迁移时,出现错误

14:01:56.573 [info]  == Running 20210610173741 MyApp.Repo.Migrations.DropIndex.up/0 forward

14:01:56.576 [info] …
Run Code Online (Sandbox Code Playgroud)

elixir ecto

9
推荐指数
1
解决办法
3805
查看次数