ecto

时间:2015-09-28 03:54:06

标签: phoenix-framework ecto

我试图将ecto用于postgres模式,但是当从repo.whatever使用时,查询将作为表名引导到公共模式。

我可以将有效的模式限定查询作为sql传递给query / 3,如下所示:

 query(Repo, "SELECT * FROM schema.table", [])

从模式中的表中获取结果。

此:

 Repo.all(%Ecto.query{from: {"schema.table", model}})

预期的sql结果是:

 SELECT a0.foo FROM schema.table as a0

但是,查询会导致无法找到表schema.table的错误。如果postgrex发送" schema.table"对于postgres,它应该被解释为直接查询中的模式限定表名,对吧? postgrex在发送之前是以某种方式解析表名吗?

1 个答案:

答案 0 :(得分:3)

Ecto.Query struct有一个名为prefix的特殊成员。使用PostgreSQL,它允许您选择特定的模式:

my_query = from(m in Model, where: m.foo == ^bar)
%{my_query | prefix: "schema"}

这将使查询(以及阅读时所有生成的模型)使用此模式。

您还可以使用以下命令为单个模型设置前缀:

model = %Model{}
Ecto.Model.put_meta(model, prefix: "schema")

这将使该模型的所有后续repo操作(如预加载其他模型或更新此模型)使用指定的模式。如上所述 - 使用读取查询的前缀(如one/2all/2等)也将为模型设置前缀。

我认为由于某些原因缺少此功能的文档。我不确定为什么,可能只是一个疏忽。