2017-09-20 6 views
1

동적으로 기본 키를 쿼리에서 가져 오려고합니다. 나는 하나의 생각이있다. 첫째, 나는 쿼리에서 스키마를 얻는다 (나는 모른다, 어떻게). 후에 스키마에서 테이블 이름을 얻습니다.Ecto의 쿼리에서 기본 키 가져 오기

{_, table_name} = %Core.Schema{}.__meta__.source 

그리고 기본 키를 가져올 SQL을 보냅니다. 는 그래서, 세 가지 질문이 탄생 :

  1. 쿼리의 스키마를 얻을 수있는 방법이 있나요 (및 테이블 이름 얻기 후) 쿼리에서 직접

  2. 가져 오기 테이블 이름을?

  3. Ecto.primary_key()는 쿼리를 처리하지 않습니다. 다른 메소드가있을 수 있습니까?

답변

2

쿼리는 스키마 모듈 (즉 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]