It's Prisma Time - 나만의 쿼리 실행

안녕하세요 여러분 👋
오늘은 자체 쿼리를 실행하는 방법을 볼 시간입니다.

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.sqlPrisma.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

좋은 웹페이지 즐겨찾기