ecto 中的模式限定查询
schema qualified queries in ecto
我正在尝试将 ecto 与 postgres 模式一起使用,但是当从 repo.whatever 使用时,查询被定向到 public 模式作为 table 名称。
我可以通过 sql 和 query/3 传递有效的模式限定查询,如下所示:
query(Repo, "SELECT * FROM schema.table", [])
并从架构中的 table 中获取结果。
这个:
Repo.all(%Ecto.query{from: {"schema.table", model}})
预期的 sql 结果是:
SELECT a0.foo FROM schema.table as a0
但是,查询结果报错,找不到table schema.table。如果 postgrex 将 "schema.table" 发送到 postgres,它应该被解释为一个模式限定的 table 名称,就像在直接查询中一样,对吧? postgrex 在发送之前是否以某种方式解析 table 名称?
Ecto.Query
结构有一个名为 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")
这将使此模型的所有后续回购操作(如预加载其他模型或更新此模型)使用指定的架构。正如我上面所说 - 使用读取查询的前缀(如 one/2
、all/2
等)也将为模型设置前缀。
我认为由于某种原因缺少此功能的文档。我不确定确切原因,可能只是一个疏忽。
我正在尝试将 ecto 与 postgres 模式一起使用,但是当从 repo.whatever 使用时,查询被定向到 public 模式作为 table 名称。
我可以通过 sql 和 query/3 传递有效的模式限定查询,如下所示:
query(Repo, "SELECT * FROM schema.table", [])
并从架构中的 table 中获取结果。
这个:
Repo.all(%Ecto.query{from: {"schema.table", model}})
预期的 sql 结果是:
SELECT a0.foo FROM schema.table as a0
但是,查询结果报错,找不到table schema.table。如果 postgrex 将 "schema.table" 发送到 postgres,它应该被解释为一个模式限定的 table 名称,就像在直接查询中一样,对吧? postgrex 在发送之前是否以某种方式解析 table 名称?
Ecto.Query
结构有一个名为 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")
这将使此模型的所有后续回购操作(如预加载其他模型或更新此模型)使用指定的架构。正如我上面所说 - 使用读取查询的前缀(如 one/2
、all/2
等)也将为模型设置前缀。
我认为由于某种原因缺少此功能的文档。我不确定确切原因,可能只是一个疏忽。