3

我正在尝试将 ecto 与 postgres 模式一起使用,但是当从 repo.whatever 使用时,查询将作为表名定向到公共模式。

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

 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 向 postgres 发送“schema.table”,它应该被解释为直接查询中的模式限定表名,对吗?postgrex 在发送之前是否以某种方式解析表名?

4

1 回答 1

3

Ecto.Querystruct 有一个特殊的成员,叫做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/2,all/2等)也将为模型设置前缀。

我认为由于某种原因缺少此功能的文档。我不知道确切的原因,可能只是一个疏忽。

于 2015-09-30T14:55:34.390 回答