It's Prisma Time - 나만의 쿼리 실행
9095 단어 javascriptdatabasetypescriptorm
오늘은 자체 쿼리를 실행하는 방법을 볼 시간입니다.
Prisma에서는 "Actionable"쿼리(INSERT, UPDATE 또는 DELETE)와 "Retrievable"쿼리(SELECT)의 두 가지 사용자 정의 쿼리를 실행할 수 있습니다. 첫 번째 것은
$executeRaw
메서드를 사용하여 실행할 수 있고 다른 하나는 $queryRaw
를 사용하여 실행할 수 있습니다.$executeRaw 메소드
이 방법을 사용하면 데이터베이스에 업데이트 또는 삭제 레코드를 삽입하는 사용자 지정 쿼리를 만들 수 있습니다.
tagged template을 사용하여 쿼리를 작성할 수 있으며 Prisma는 이를 "마법처럼"실행합니다.
더 잘 이해하기 위해 실제로 살펴 보겠습니다.
const result = await prisma.$executeRaw`
INSERT INTO posts (title, content, published, updatedAt)
VALUES (${"Post Title"}, ${"Post Content"}, ${false}, ${new Date()});`;
console.log(`Insert result: ${result}`);
보시다시피, 이 방법을 사용하는 것은 그리 어렵지 않습니다.
태그가 지정된 템플릿을 사용하여 쿼리를 작성하고 모든 매개변수를 안전하게 전달할 수 있습니다. 완전한 안전에? 예, 당신은 올바르게 읽고 있습니다. 이 방법을 사용하면 구문
${parameter}
과 함께 전달된 모든 매개변수가 SQL-Injection으로부터 안전하므로 이러한 공격에 대해 걱정할 필요가 없습니다.이에 대해 자세히 읽을 수 있습니다here.
마지막으로 남기고 싶은 것은 이 메서드의 반환 값입니다. 이 메서드는 쿼리의 영향을 받는 레코드 수를 반환합니다. 따라서 쿼리가 올바르게 실행되는지 확인할 수 있습니다.
$queryRaw 메소드
이 방법을 사용하면 사용자 지정 쿼리를 사용하여 데이터를 검색할 수 있습니다.
때로는 더 많은 성능이 필요하고 Prisma에서 생성한 쿼리를 다시 작성해야 합니다. 이 경우
$queryRaw
메서드가 우리의 생명선입니다.이 방법은 Tagged Template을 사용하며 SQL-injection에 의한 공격도 방지합니다.
이 방법의 결과는 항상 배열이며 이 배열의 유형은 쿼리 결과에 따라 다릅니다. 이 개념을 더 잘 설명하기 위해 예를 들어보겠습니다.
const result: Post[] = await prisma.$queryRaw<Post[]>`
SELECT p.id, p.title, p.content, p.published, p.createAt, p.updatedAt
FROM posts p
WHERE p.published = ${true}
ORDER BY p.createAt DESC`;
result.forEach(post => {
const { id, title, content, createAt, published, updatedAt } = post;
console.log({
id,
title,
content,
createAt,
published,
updatedAt,
});
});
이 코드를 자세히 보면
result
변수가 Post 유형의 배열이고 $queryRaw
메서드가 이를 반환 유형으로 나타냅니다. 이렇게 하면 다음 코드 행에서 typescript로 올바른 검사를 받습니다. 그러나 명심해야 할 것이 있습니다. 쿼리 결과에서 사용자 유형으로의 변환은 Prisma에서 보장하지 않으며 이 경우에는 사용자의 책임입니다.주의 결과 유형을 지정하지 않으면 기본적으로 Prisma는 유형을 반환합니다.
계속해서 이러한 방법을 사용할 때 채택할 수 있는 또 다른 기능을 살펴보겠습니다.
때로는 사용자 정의 쿼리에서 IN 연산자를 사용해야 합니다. 아마도 배열의
map
메서드를 사용하는 것이 옳다고 생각하고 있을 것입니다. 불행히도 그렇지 않습니다. 이를 위해 Prisma는 특정 메소드를 제공합니다Prisma.join
. 이 메서드는 안전 모드에서 IN 절을 빌드하므로 사용자 지정 쿼리에서 사용할 수 있습니다.행동으로 보자
const posts = await prisma.$queryRaw<
Post[]
>`SELECT * FROM posts WHERE id IN (${Prisma.join([1, 2, 3])})`;
console.log(`Posts in 1,2,3: ${JSON.stringify(posts, null, 2)}`);
알 수 있듯이 이 코드에서 IN 절의 값은
join
메서드를 사용하여 작성되며 그렇게 어렵지는 않지만 이러한 경우에 사용한다는 점을 명심하는 것이 중요합니다.Prisma에 의해 노출된 다른 두 가지 좋은 기능은
Prisma.sql
및 Prisma.empty
입니다. 이러한 기능을 통해 동적 쿼리를 생성할 수 있습니다. 필터가 있는 경우에만 쿼리에서 WHERE 절을 수행해야 한다고 상상해 보십시오. 이 두 기능을 결합하여 수신하는 데이터에 따라 달라지는 사용자 지정 쿼리를 만들 수 있습니다. 예제를 보자const author: string | undefined = "transaction";
const authors = await prisma.$queryRaw<Author[]>`
SELECT * FROM authors a ${
!!author
? Prisma.sql`WHERE a.firstName || ' ' || a.lastName LIKE ${`%${author}%`}`
: Prisma.empty
}`;
console.log(`Authors: ${JSON.stringify(authors, null, 2)}`);
보시다시피, 이 예에서는 작성자 변수의 값을 확인하고, 정의된 경우 쿼리는 필터(Prisma.sql)를 사용하여 실행되고, 그렇지 않으면 쿼리는 필터(Prisma.empty) 없이 실행됩니다.
여기에서도 이해하기 어려운 것은 없지만 쿼리를 더 잘 작성하기 위한 두 가지 정말 좋은 방법입니다.
자, 오늘은 여기까지입니다.
다음 기사에서는 Prisma로 마이그레이션을 사용하는 방법을 살펴보겠습니다.
곧 봐요
바이바이 👋
이 기사의 코드를 찾을 수 있습니다here
Reference
이 문제에 관하여(It's Prisma Time - 나만의 쿼리 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/this-is-learning/its-prisma-time-execute-your-own-queries-4olp텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)