标签: ecto

如何在Ecto中更改字段类型?

我有一个架构:

schema "editables" do
    field :title, :string
    field :content, :string

    timestamps
  end
Run Code Online (Sandbox Code Playgroud)

现在我想将一个字段表单的类型更改:integer:binary.编写迁移的正确方法是什么,因为使用add不起作用......?

def change do
    alter table(:editables) do
      add :title, :binary
      add :content, :binary

      timestamps
    end
  end
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

22
推荐指数
1
解决办法
8007
查看次数

适配器Ecto.Adapters.Postgres未编译

我无法创建我的凤凰项目.会喜欢一些关于如何修复它的建议.

设置细节:

  • Ubuntu 16.04.4 LTS
  • Erlang/OTP 21 [erts-10.1] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [hipe]
  • Elixir 1.7.3(使用Erlang/OTP 20编译)
  • 混合1.7.3(用Erlang/OTP 20编译)
  • Ecto v3.0.0

我正在关注Phoenix Up and Running制作应用程序.

mix phx.new hello
cd hello
mix ecto.create
Run Code Online (Sandbox Code Playgroud)

最后一个命令给了我:

 == Compilation error in file lib/hello/repo.ex ==
 ** (ArgumentError) adapter Ecto.Adapters.Postgres was not compiled, ensure it is correct and it is included as a project dependency
     lib/ecto/repo/supervisor.ex:71: Ecto.Repo.Supervisor.compile_config/2
     lib/hello/repo.ex:2: (module)
     (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
     (elixir) lib/kernel/parallel_compiler.ex:206: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/6
Run Code Online (Sandbox Code Playgroud)

我安装了postgres.我有postgres超级用户.

postgresql elixir ecto phoenix-framework

22
推荐指数
2
解决办法
2991
查看次数

设置Phoenix Framework和Ecto以使用UUID:如何插入生成的值?

几天前,我开始使用Elixir和Phoenix Framework(v 0.12.0)和Postgres数据库.我正在尝试创建一个具有UUID主键的表,我更喜欢顺序默认值.

在使用mix phoenix.gen.html生成模型和迁移文件并遵循Phoenix文档中的其他步骤之后,我已经更改了

def model do
    quote do
      use Ecto.Model
    end
  end
Run Code Online (Sandbox Code Playgroud)

web.ex

def model do
  quote do
    use Ecto.Model
    @primary_key {:id, :uuid, []}
    @foreign_key_type :uuid
  end
end
Run Code Online (Sandbox Code Playgroud)

正如Ecto文档中提到的那样.我也将迁移更改为

create table(:tblname, primary_key: false) do
  add :id, :uuid, primary_key: true
  [other columns]
end
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我尝试从自动生成的表单向表中添加一个条目时,我收到一个错误,因为它id是null.如果我手动将id-column 添加到模型中,则会收到列已存在的错误.如果我忽略设置primary_key为false table/2并删除id列,则使用顺序id列生成表.

我是否需要id在变更集中手动设置,或者在设置我的应用程序以使用UUID时出错?提前致谢

postgresql elixir ecto phoenix-framework

21
推荐指数
2
解决办法
6834
查看次数

如何在Phoenix框架中处理关联和嵌套表单?

在Phoenix框架中处理关联和嵌套表单的方法是什么?如何创建具有嵌套属性的表单?如何在控制器和模型中处理它?

elixir ecto phoenix-framework

20
推荐指数
1
解决办法
6692
查看次数

Ecto删除引用的数据库记录

我有2张桌子:

用户:

id
username
password

unique_index username

(the schema has a has_many other)
Run Code Online (Sandbox Code Playgroud)

其他:

id
user_id - references(:users)
foo

index user_id

(the schema has a belongs_to user)
Run Code Online (Sandbox Code Playgroud)

在"其他"的变更集中,我有这个

model
|> cast(params, @req, @opt)
|> foreign_key_constraint(:user_id)
Run Code Online (Sandbox Code Playgroud)

我在这一点上的假设是"其他"ecto模型需要一个"用户"与它相关联才能存在(这就是我想要的)

但我的第二个假设是,如果我删除"用户"记录,那么所有关联的"其他"记录将被删除(通过级联删除)

实际发生的是我在尝试删除"用户"记录时有一个Ecto.ConstraintError(我假设因为有一个与该用户关联的"其他"记录)

那么我将如何以我想要的方式工作呢:

  • "用户"可以独立创建
  • 可以创建"其他"但必须属于"用户"
  • 当删除"其他"时,它不会影响任何其他内容
  • 删除"用户"时,它也会删除所有关联的"其他"记录

对于引用它的任何项目,基本上是用户级联删除

elixir ecto

20
推荐指数
2
解决办法
8830
查看次数

如何比较Elixir和Ecto的日期

我有一个Ecto.DateTime来自数据库列的实例,我需要检查这个日期是否超过5分钟.

最好的方法是什么?

为了更清楚,这是我在ruby中所需要的 - >

updated_at < (Time.now - 5.minutes)
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

19
推荐指数
1
解决办法
2715
查看次数

禁用Elixir Ecto Debug输出

无论在iex>或使用mix run -e "My.code"当我运行使用外生混合项目中,外生的调试机制显示像下面一堆sql语句的

16:42:12.870 [debug] SELECT a0.`id` FROM `account` AS a0 WHERE (a0.`account_name` = ?) ["71000000313"] (39.6ms)`
...
Run Code Online (Sandbox Code Playgroud)

当我不再需要调试输出时,如何关闭它,我找不到任何关于如何更改ecto日志级别的东西.

提前致谢.

debugging elixir ecto

18
推荐指数
4
解决办法
7278
查看次数

如何在Phoenixframework中使用RethinkDB?

刚到Elixir/Phoenix我想使用RethinkDB而不是PostgreSQL,但我只在PostgreSQL上找到文档/示例(它似乎是默认/官方数据库).Hamiltop(Rethinkdb-elixir)提供了一个非常好的软件包,但遗憾的是Wiki中的文档还没有准备就绪,而自述文件对我来说还不够.我绝对不想使用SQL(我来自使用Meteor/MongoDB,其中数据库不是问题).谁能告诉我一个我需要的代码的简单示例:

  1. 连接到RethinkDB;
  2. 启动服务器/管理服务器/连接;
  3. 创建数据库/表;
  4. 执行基本的CRUD操作.

这可能听起来很傻但是Meteor为我们照顾这些,现在这对我来说是一个问题...因为我无法正确地做到这一点.谢谢!

elixir rethinkdb ecto phoenix-framework

18
推荐指数
1
解决办法
1812
查看次数

在Ecto中插入关联的模型

我正在尝试插入发票结构及其关联的发票项目.我可以插入发票数据,并调用匿名函数来验证,转换和插入每个项目.由于insert/2不会产生返回,如果一个项目未通过验证或插入,如何在仍然能够回滚整个事务的同时获取项目的invoice_id?

我把代码放在我自己的回购中,这里是:

def insertassoc(params) do
 Repo.transaction(fn ->    
  i = Invoice.changeset(params["data"], :create)
    if i.valid? do
      Repo.insert(i)
    else
      Repo.rollback(i.errors)
    end

  insert_include = fn k ->
    c = InvoiceItem.changeset(k, :create)
    if c.valid? do
      Repo.insert(c)
    else
      Repo.rollback(c.errors)
    end
  end

  for include <- params["includes"] do
    insert_include.(Map.merge(include, %{"invoice_id" => ????}))
  end

 end)
end
Run Code Online (Sandbox Code Playgroud)

以下是我在控制器中使用它的方法:

def create(conn, params) do
 case InvoiceRepo.insertassoc(params) do
  {:ok, x} ->
    json conn, Map.merge(params, %{"message" => "OK"})
  {:error, x} ->
    json conn |> put_status(400), Map.merge(params, %{"message" 
    => "Error"})
 end
end
Run Code Online (Sandbox Code Playgroud)

有没有很多最新的例子与Ecto,所以抱歉,如果这些是noob问题;-).有人有想法吗?我尝试将发票插入放在私有函数中,并使用case块来确定主事务是否应回滚,但我无法弄清楚如何从中获取发票ID.

elixir ecto phoenix-framework

17
推荐指数
2
解决办法
8397
查看次数

如何处理Phoenix中的模式多态?

在Phoenix中处理多态关联的推荐方法似乎是添加一个包含对其他模式的引用的中间模式:

所以,如果我想用不同种类的动物创建模式,我会这样做:

defmodule Animal do
  use Ecto.Model

  schema "animals" do
    belongs_to(:dog, Dog)
    belongs_to(:cat, Cat)
    belongs_to(:owner, PetOwner)
  end
end

defmodule Dog do
  use Ecto.Model

  schema "dogs" do
  end
end

defmodule Cat do
  use Ecto.Model

  schema "cats" do
  end
end

defmodule PetOwner do
  use Ecto.Model

  schema "pet_owners" do
    has_one(:pet, Animal)
  end
end
Run Code Online (Sandbox Code Playgroud)

但我也可以使用PetOwner包含二进制字段和类型的模式:

defmodule Dog do
  use Ecto.Model

  schema "dogs" do
  end
end

defmodule Cat do
  use Ecto.Model

  schema "cats" do
  end
end

defmodule PetOwner do
  use …
Run Code Online (Sandbox Code Playgroud)

elixir polymorphic-associations ecto phoenix-framework

17
推荐指数
1
解决办法
1026
查看次数