Ecto 해킹: 원시 SQL에서 Ecto 쿼리 구성
Ecto.Query
을 위한 "해킹"팁을 공유합니다. Ecto.Query
의 모든 좋은 기능을 원하지만 보호 장치를 우회하려는 경우에 이 작업을 수행할 수 있습니다.약간의 소개
Ecto
는 Elixir의 정말 멋진 데이터베이스 계층입니다. SQL의 경우 Elixir 내부에서 읽기 쉽고 간결한 방식으로 SQL 쿼리를 정의하고 정의된 데이터 구조에 대한 자동 매핑으로 실행할 수 있습니다.Ecto에서 SQL 쿼리 및 실행 예제
Ecto.Query
는 Ecto
에서 쿼리를 정의하기 위한 기본 모듈 및 데이터 구조입니다. Ecto.Query
는 구성 가능하고 동적으로 프로그래밍할 수 있으므로 많은 부분을 확장하고 쿼리 기능을 재사용할 수 있습니다.with_search_keyword 쿼리 필터링 기능을 정의하고 bill_of_ladings 기능의 일부로 사용합니다.
원시 쿼리에서 Ecto 구성
기본적으로
from
, Ecto.Query
의 일반적인 구성 방법은 복잡한 SQL을 지원하지 않습니다. from
다음과 같이 문자열에서 Ecto.Schema
데이터 구조 및 테이블 이름만 지원합니다.from(t in "transporter",
where: t.name == "STAR TRANSPORT COMPANY")
그러나 복잡한 조인 쿼리가 있는 경우 일반적으로 사용되는
fragment
를 통해 조인에서 원시 SQL을 지정할 수 있습니다.from(t in "transporter",
join: i in fragment("SELECT * FROM invoice WHERE invoice.transporter_id = ?", t.id),
where: i.date == ^date
)
이 원시 SQL 조인을 활용하여 원시 SQL을
Ecto.Query
의 기본 개체로 가져올 수 있습니다.더미 쿼리 정의
더미 쿼리가 필요하고 정확히 하나의 결과가 필요합니다. 예를 들어 "상수"테이블에서 쿼리하고 1로 제한할 수 있습니다.
dummy_query = from x in "truck_types", as: :dummy, select: x.ksuid, limit: 1
원시 쿼리와 더미 쿼리 조인
subquery
를 사용하여 더미 쿼리를 재사용하여 조인 구성 요소로 사용할 수 있으며, 이를 원시 데이터와 조인하는 데 사용합니다.aggregate_subquery =
from(d in subquery(dummy_query))
|> join(:inner, [], raw in fragment(@raw_sql), on: true, as: :raw)
|> select([raw: raw], %{
id: raw.id,
name: raw.name
})
@raw_sql의 예는 아래와 같습니다. @raw_sql은 상수 문자열이어야 합니다.
SELECT id, name FROM transporter
UNION ALL
SELECT id, name FROM shipper
조인된 쿼리를 하위 쿼리로 래핑(다시)
조인된 쿼리를 하위 쿼리로 다시 래핑하면 Ecto.Query와 같지만 사용자 지정 SQL을 사용하는 쿼리가 생성됩니다.
query = from(q in subquery(aggregate_subquery))
이제 일반적인 Ecto 방식으로 쿼리를 사용할 수 있습니다.
아래와 같이 이름이 "ANDI"인 운송업자와 화주로부터 검색합니다.
from(q in query,
where: name == "ANDI"
)
왜 해킹하고 싶습니까?
Ecto
는 SQL을 작성하는 정말 유연하고 표현적인 방법을 가지고 있는데 왜 Raw SQL 작성과 같은 해킹에 의존하고 싶습니까?저에게는
Ecto.Query
로 이미 구축된 기존 기능과 함께 Postgres 특정 SQL 기능으로 가득 찬 ~500줄의 기존 SQL 쿼리를 개조해야 하는 경우가 있습니다. Ecto
에 다시 작성하면 이러한 500줄의 SQL을 해독해야 하며 Raw SQL 작성의 안전 해치를 위해 fragment
로 가득 차게 됩니다. Raw SQL에서 모든 작업을 수행하는 것이 이해하기 쉬울 것이라고 생각하여 이 해킹으로 이어졌습니다.
Reference
이 문제에 관하여(Ecto 해킹: 원시 SQL에서 Ecto 쿼리 구성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/calvinsadewa/hacking-ecto-constructing-ecto-query-from-raw-sql-1m8e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)