我想从查询中动态获取主键。我有一个想法。首先,我从查询中获取模式(我不知道,如何)。之后,我从架构中获取表名:
{_, table_name} = %Core.Schema{}.__meta__.source
并发送SQL,它将获得主键。 所以,三个问题诞生了:
有没有办法从查询中获取架构(以及获取表名后)
直接从查询中获取表名?
Ecto.primary_key()不能处理查询,也许还有其他方法?
答案 0 :(得分:3)
如果查询是使用架构模块构建的(即from(p in Post)
,而不是from(p in "posts")
),则可以使用查询的from
字段恢复模块:
iex(1)> query = from(p in Post, where: p.id == 1)
#Ecto.Query<from p in MyApp.Post, where: p.id == 1>
iex(2)> %{from: {_table, module}} = query
#Ecto.Query<from p in MyApp.Post, where: p.id == 1>
iex(3)> module
MyApp.Post
要获取模块架构中定义的主键,您可以在模块上调用.__schema__(:primary_key)
:
iex(4)> module.__schema__(:primary_key)
[:id]