>기술 주변기기 >IT산업 >Elixir ' s ecto querying dsl : beyond the basic

Elixir ' s ecto querying dsl : beyond the basic

Lisa Kudrow
Lisa Kudrow원래의
2025-02-18 10:53:09926검색

Elixir ' s ecto querying dsl : beyond the basic

이 기사는 Elixir의 Ecto Querying DSL : The Basics를 이해하는 데 다루는 Ecto의 기본 사항을 바탕으로합니다. 이제 쿼리 구성, 조인 및 협회, SQL 조각 분사 주입, 명시 적 캐스팅 및 동적 필드 액세스를 포함한 Ecto의 고급 기능을 탐색하겠습니다. 다시 한 번, Elixir의 기본 지식과 Ecto의 기본 사항이 가정됩니다. Elixir의 Ecto Library에 대한 소개에서 다룹니다. 키 테이크 아웃 Elixir ' s ecto querying dsl : beyond the basic ecto를 사용하면 Elixir의 쿼리 구성을 허용하여 개발자가 재사용 가능한 쿼리를 생성하고 건조기 및보다 관리 가능한 코드를 결합 할 수 있습니다. 키워드 쿼리 구문 또는 매크로 구문을 사용하여 달성 할 수 있습니다. ecto는 모델에서 테이블 관계 (조인 및 연관성)를 처리 할 수있는 능력을 제공합니다. has_one/3, has_many/3 및 foods_to/3 매크로를 사용하여 정의 된 협회는 개발자가 모델에서 외래 키로 구현 된 테이블 관계를 처리 할 수 ​​있도록합니다. ecto는 SQL 조각 분사를 지원합니다. SQL Code가 Fragment/1 함수를 사용하여 쿼리에 직접 주입 할 수있는 기능입니다. 이는 개발자가 Ecto의 기능으로 덮여 있지 않은 작업을 위해 RAW SQL로 다시 떨어 뜨려야 할 때 유용합니다. ecto는 명시 적 캐스팅 및 동적 필드 액세스를 지원합니다. 명시 적 캐스팅은 개발자가 표현식 유형을 지정할 수있게 해주 며 동적 필드 액세스는 주어진 테이블에서 필드를 검색 할 수 있으므로 쿼리를보다 일반적이고 다재다능하게 만듭니다.

쿼리 컴포지션

ecto의 별도의 쿼리를 함께 결합하여 재사용 가능한 쿼리를 만들 수 있습니다. 예를 들어 세 가지 개별 쿼리를 만들고 함께 결합하여 건조기 및 재사용 가능한 코드를 달성하는 방법을 살펴 보겠습니다.

SQL 버전은 상당히 반복적이지만 반면에 Ecto 버전은 매우 건조합니다. 첫 번째 쿼리 (get_users_overview)는 기본 사용자 정보를 검색하는 일반적인 쿼리 일뿐입니다. 두 번째 쿼리 (search_by_username)는 검색중인 일부 사용자 이름에 따라 사용자 이름을 필터링하여 첫 번째 쿼리를 빌드합니다. 세 번째 쿼리 (Pagitinate_Query)는 두 번째 쿼리를 빌드하여 결과를 제한하고 특정 오프셋에서 가져옵니다 (페이지 매김의 기초를 제공하기 위해). 위의 세 쿼리를 모두 사용하여 특정 사용자를 검색 할 때 검색 결과를 제공 할 수 있다고 상상하기 어렵지 않습니다. 코드베이스 전체에서 쿼리의 불필요하게 반복하지 않고 다른 응용 프로그램 요구를 수행하기 위해 다른 쿼리와 함께 다른 쿼리와 함께 사용될 수 있습니다. 조인 및 협회 조인은 쿼리를 할 때 꽤 근본적이지만 지금은 그냥 다루고 있습니다. 그 이유는 Ecto에서만 결합에 대해 배우는 것이 유용하지 않기 때문입니다. 우리는 협회에 대해서도 알아야합니다. 이것들에 대해 배우기가 어렵지는 않지만 지금까지 다루는 다른 주제만큼 사소한 것은 아닙니다. <h2> 간단히 말해서, 협회를 통해 개발자는 모델에서 테이블 관계 (외래 키로 구현)를 처리 할 수 ​​있습니다. HAS_ONE/3 및 HAS_MANY/3 매크로 (다른 모델을 포함하는 모델의 경우) 및 FORG_TO/3 매크로 (다른 모델과는 별개의 모델 - 이물 키가있는 모델)를 사용하여 각 모델의 스키마에 정의됩니다. . ectoing 응용 프로그램을 살펴보면 ectoing.user 모델과 ectoing.message 모델 사이의 연관성의 한 가지 예를 볼 수 있습니다. ectoing.user에 정의 된 스키마는 다음 연관성을 정의합니다 </h2> <that that> 우리는 한 사용자가 많은 메시지 (ectoing.message)를 가지고 있으며이 협회를 호출하고 있습니다. <ect> ectoing.message 모델에서 다음 연관 관계를 정의합니다. <p> 여기, 우리는 모델 인 ectoing.message가 ectoing.user 모델에 속한다고 말합니다. 우리는 또한 Association을 다음과 같이 명명했습니다. 기본적으로 Ecto는 _id를 속임수 _to 연관 이름에 추가하여이를 외부 키 이름으로 사용합니다 (여기서 : user_id). 이 기본 동작은 외국 _key 옵션을 지정하여 외래 키 이름을 수동으로 지정하여 재정의 할 수 있습니다. 예를 들면 : </p> <p> <take> 이제 가입을 사용하여 사용자와 메시지를 가져 오는 간단한 쿼리를 살펴 보겠습니다. </take></p> <p> <:> 반환 된 값 : </:></p> <pre class="brush:php;toolbar:false"><span>SELECT id, username FROM users; </span><span>SELECT id, username FROM users WHERE username LIKE "%tp%"; </span><span>SELECT id, username FROM users WHERE username LIKE "%tp%" LIMIT 10, 0; </span> 눈에 띄게, 우리는 다음을 포함하여 많은 언로드 협회가 있습니다. 이 연관성을로드하는 것은 쿼리의 결과 세트 또는 쿼리 자체에서 두 가지 방법 중 하나로 수행 할 수 있습니다. 결과 세트에서 연관을로드하면 Repo.preload 함수를 사용하여 수행 할 수 있습니다.

쿼리 내에서 연관성을로드하여 ASSOC 및 PRELOAD 기능의 조합을 사용하여 수행 할 수 있습니다.

이제 우리는 결과에 메시지 협회가로드되었습니다.

협회는 우리를위한 기본 키 및 외국 키 열에 암시 적으로 가입하므로 다음을 지정할 필요가 없습니다. 위에서부터, 우리는 또한 사전로드 협회에 관해서는 게으르게로드되지 않는다는 것을 알 수 있습니다. 원한다면 협회는 명시 적으로로드되어야합니다 이 기사는 특히 Ecto의 쿼리 DSL에 중점을두기 때문에 여기에서 연결, 업데이트 또는 삭제를 다루지 않습니다. 이에 대한 자세한 내용은 Ecto Associations 및 Embeds와 함께 작업하는 블로그 게시물을 확인하십시오. SQL 조각 분사 Ecto는 많은 기능을 제공하는 동안 SQL의 공통 작업에 대한 기능 만 제공합니다 (전체 SQL 언어를 모방하는 것을 목표로하지 않음). RAW SQL로 다시 떨어 뜨려야 할 때 Fragment/1 함수를 사용할 수있어 SQL 코드가 쿼리에 직접 주입 될 수 있습니다. 예를 들어 사용자 이름 필드에서 대소 문자 검색을 수행하겠습니다.

(위의 내용은 MySQL 특이 적 SQL을 포함합니다. 다른 데이터베이스를 사용하는 경우에는 효과가 없습니다.)

. > 조각/1 함수는 SQL 코드를 첫 번째 매개 변수로 주입하려는 문자열로 사용합니다. 열과 값이 SQL 코드 조각에 바인딩 될 수 있습니다. 이것은 문자열의 자리 표시 자 (물음표)를 통해 이루어지며, 후속 인수는 각각 각 자리 표시 자에게 묶인 조각으로 전달되었습니다. 명시 적 캐스팅

ecto가 모델의 스키마 정의를 사용하는 또 다른 방법은 스키마에 정의 된 각 필드 유형에 쿼리 내에서 보간 된 표현식을 자동으로 캐스팅하는 것입니다. 이러한 보간 된 표현은 비교중인 필드의 유형으로 캐스트됩니다. 예를 들어, U.username> ^username과 같은 쿼리 조각이있는 경우 U.username이 필드로 정의된다 : 사용자 이름, : 스키마의 문자열은 ecto에 의해 String에 자동으로 캐스트됩니다. > 때때로, 우리는 때때로, 우리는 ecto가 정의 된 필드 유형에 보간 된 표현을 시전하기를 원하지는 않습니다. 다른 경우에는 Ecto가 유형을 표현식으로 시전하는 것으로 추론 할 수 없습니다 (일반적으로 SQL 코드의 조각이 관련된 경우). 두 경우 모두 유형/2 함수를 사용하여 표현식과 캐스트 해야하는 유형을 지정할 수 있습니다. 더 흥미로운 시나리오이기 때문에 표현을 다른 유형으로 시전하고 싶은 첫 번째 사례를 봅시다. ectoing 응용 프로그램에서 우리는 Ecto.schema.timestamps 매크로를 사용하여 각 테이블에 두 개의 추가 필드를 추가했습니다 : updated_at 및 inserted_at. 매크로는 기본적 으로이 필드의 유형을 설정하여 Ecto.dateTime 유형을 갖도록 설정합니다. 이제 현재 달에 등록한 사용자 수를 확인하려면 다음과 같은 간단한 쿼리를 사용할 수 있습니다.

그러나 이것은 ecto.date struct를 ecto.dateTime struct에 캐스트 할 수 없기 때문에 우리에게 ecto.casterror를 줄 것입니다 (우리는 보간 된 ecto.date 표현식을 Ecto.dateTime 유형의 분야와 비교하기 때문에. ). 이 경우, 우리는 ecto.dateTime struct를 구축하거나 Ecto.dateTime 대신 Ecto.Date에 표현을 캐스팅하고 싶은 Ecto를 지정할 수 있습니다.

이제, ecto는 행복하게 쿼리를 받아들입니다. 캐스트 작업 후, 보간 된 ecto.date 표현식을 기본 : 날짜 유형으로 변환 한 다음 기본 데이터베이스 (MySQL,이 경우 MySQL)가 날짜와 DateTime의 비교를 처리하도록합니다.
<span>SELECT id, username FROM users;
</span><span>SELECT id, username FROM users WHERE username LIKE "%tp%";
</span><span>SELECT id, username FROM users WHERE username LIKE "%tp%" LIMIT 10, 0;
</span>
. 동적 필드 액세스

Queries를 구성하여 예제로 돌아가서 사용자 이름 검색을 수행했습니다.

이후에 나온 페이지 매김 쿼리와 마찬가지로이 쿼리도 일반화하여 주어진 테이블에서 필드를 검색 할 수 있습니다. 동적 필드 액세스를 수행하여 수행 할 수 있습니다.

필드/2 함수는 필드를 동적으로 지정해야 할 때 사용됩니다. 첫 번째 논쟁은 액세스 할 필드의 표이며, 두 번째 인수는 필드 이름 자체이며 원자로 지정됩니다. 위와 같은 일반 쿼리를 사용하면 함수 내에서이를 캡슐화하고 매개 변수를 사용하여 주어진 쿼리에 지정된 테이블에서 주어진 필드를 검색 할 수 있습니다.

결론 ecto의 쿼리 DSL에 대한이 기사와 이전 기사 모두에서 우리는 그것이 할 수있는 많은 것을 다루었습니다. 언급 된 기능은 응용 프로그램 내에서 ECTO를 사용할 때 발생하는 대부분의 사례를 다루어야합니다. 그러나 여전히 다루지 않은 주제 (예 : 쿼리 접두사)가 여전히 있습니다. 서브 쿼리, 집계 쿼리 및 다수의 협회를 포함하여 Ecto의 예상 2.0 릴리스에는 다가오는 새로운 기능도 있습니다. 이것들은 Ecto의 쿼리 DSL에만 해당되지 않는 다른 기능뿐만 아니라 향후 기사에서 다루어 질 것입니다. Elixir의 ecto 쿼리 DSL <span>SELECT id, username FROM users; </span><span>SELECT id, username FROM users WHERE username LIKE "%tp%"; </span><span>SELECT id, username FROM users WHERE username LIKE "%tp%" LIMIT 10, 0; </span>에 대한 자주 묻는 질문 (FAQS) Elixir의 Ecto Querying DSL이란 무엇이며 왜 중요한가?

Elixir의 Ecto 쿼리 DSL (도메인 특정 언어)은 데이터베이스와 상호 작용하는 강력한 도구입니다. SQL에 가까운 구문에 쿼리를 쓰는 방법을 제공하지만 컴파일 타임 안전의 추가 이점, Elixir 코드와의 통합 및 추상화 및 코드 재사용 가능성이 추가됩니다. 개발자가 복잡한 쿼리를보다 읽기 쉽고 유지 관리 가능한 방식으로 작성하여 오류 가능성을 줄이고 코드를 이해하고 수정하기 쉽게 만들 수 있기 때문에 중요합니다.

offset <span>= 0
</span>username <span>= <span>"%tp%"</span>
</span>
<span># Keywords query syntax
</span>get_users_overview <span>= from u in Ectoing.User,
</span>  <span>select: [u.id, u.username]
</span>
search_by_username <span>= from u in get_users_overview,
</span>  <span>where: like(u.username, ^username)
</span>
paginate_query <span>= from search_by_username,
</span>  <span>limit: 10,
</span>  <span>offset: ^offset
</span>
<span># Macro syntax
</span>get_users_overview <span>= (Ectoing.User
</span><span>|> select([u], [u.id, u.username]))
</span>
search_by_username <span>= (get_users_overview
</span><span>|> where([u], like(u.username, ^username)))
</span>
paginate_query <span>= (search_by_username
</span><span>|> limit(10)
</span><span>|> offset(^offset))
</span>
Ectoing<span>.Repo.all paginate_query
</span>
ecto는 테이블 간의 연관성을 어떻게 처리합니까?

. ecto는 has_many, has_one 및 foods_to 매크로를 사용하여 테이블 간의 연관성을 정의하는 방법을 제공합니다. 이러한 협회를 사용하면 편리하고 효율적인 방식으로 관련 데이터를 쿼리 할 수 ​​있습니다. 예를 들어, 사용자 스키마가 있고 각 사용자가 많은 게시물이있는 경우 간단한 쿼리를 사용하여 사용자의 모든 게시물을 검색 할 수 있습니다.

ecto를 사용하여 조인, 하위 퀘스트 및 집계와 관련된 복잡한 쿼리를 수행 할 수 있습니까? ?

예, Ecto는 조인, 하위 쿼리 및 집계를 포함한 광범위한 쿼리 작업을 지원합니다. Join 키워드를 사용하여 테이블 조인, 키워드에서 하위 쿼리 및 Sum, Avg, Min 및 Max와 같은 기능을 수행하여 집계를 수행 할 수 있습니다. 이로 인해 Ecto는 복잡한 방식으로 데이터를 쿼리하기위한 강력한 도구입니다.

ecto는 트랜잭션을 어떻게 처리합니까?

ecto는 단일 트랜잭션에서 여러 작업을 실행할 수있는 repo.transaction function을 제공합니다. 작업이 실패하면 트랜잭션 내에서 모든 변경 사항이 롤백됩니다. 이것은 데이터 일관성과 무결성을 보장합니다.

PostgreSQL 이외의 데이터베이스와 함께 ECTO를 사용할 수 있습니까?

Ecto는 처음에 PostgreSQL과 함께 작동하도록 설계되었지만 이제는 MySQL 및 MySQL을 포함한 다른 데이터베이스도 지원합니다. sqlite. ecto 저장소를 설정할 때 데이터베이스 유형을 지정할 수 있습니다.

Ecto는 어떻게 마이그레이션을 처리합니까?

Ecto는 데이터베이스 테이블을 작성, 수정 및 삭제할 수있는 강력한 마이그레이션 시스템을 제공합니다. 제어되고 가역적 인 방법. 믹스 작업을 사용하여 마이그레이션 파일을 생성 한 다음 ECTO의 DSL을 사용하여 마이그레이션 파일의 변경 사항을 정의 할 수 있습니다.

데이터베이스에 데이터를 삽입하거나 업데이트하기 전에 ECTO를 사용하여 데이터를 검증 할 수 있습니까? . 예, ECTO는 데이터베이스에 삽입되거나 업데이트되기 전에 데이터를 검증 할 수있는 ChangeSet 기능을 제공합니다. 스키마에서 유효성 검사 규칙을 정의한 다음 변경 사항 기능을 사용하여 이러한 규칙을 데이터에 적용 할 수 있습니다. Ecto는 데이터베이스 연결을 어떻게 처리합니까?

ecto는 연결 풀을 사용하여 데이터베이스를 관리합니다. 사이. 이를 통해 여러 동시 쿼리를 효율적으로 처리하여 무거운 하중에서도 애플리케이션이 반응 형 상태로 유지되도록합니다.

ecto를 사용하여 원시 SQL 쿼리를 수행 할 수 있습니까?

예, Ecto의 DSL은 A가 제공합니다. 쿼리를 쓰는 높은 수준의 추상적 인 방법, ecto.adapters.sql.query 함수를 사용하여 필요한 경우 원시 SQL 쿼리를 실행할 수 있습니다. Ecto는 개회 쿼리를 어떻게 처리합니까? > Ecto는 사전 정의 된 스키마없이 쿼리를 동적으로 빌드 할 수있는 ecto.query.api.dynamic 함수를 제공합니다. 사용자 입력 또는 기타 런타임 데이터를 기반으로 쿼리를 빌드해야 할 때 유용 할 수 있습니다.

위 내용은 Elixir ' s ecto querying dsl : beyond the basic의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.