Programing/Vapor

[Vapor] SQL 문으로 쿼리문 사용하기

5주년 2020. 6. 19. 01:44

안녕하세요~! 5anniversary 입니다!!

 

오늘은 SQL문을 사용하는 방법에 대해 알아보도록 할 거예요~!

 

제가 현재 진행 중인 프로젝트 내에서 검색, Like문을 사용해야 하는 경우가 있는데, FluentMySQL에서는 제공하지 않아 

 

생 쿼리문을 사용해보도록 할 거예요. 이외에도 불가능한 경우가 있는 경우 사용할 수가 있겠죠??

 

한번 알아보도록 하죠~!

 

오늘 사용할 메서드는 withPooledConnection()이라는 메소드인데요, 이 메소드는 기본 제공되는 DatabaseKit에서 제공되는 메서드예요

 

해당 메서드를 이용하는 방법은 사용자로부터 받는 Request에서 각자의 vapor에서 사용하는 DB에 맞춰서 코드를 작성해주면 되는데요

 

func rawExampleHandler(_ req: Request) throws -> Future<Response> {
   // search라는 parameter값을 받아줌
   guard let search = req.query[String.self, at: "search"] else {
        throw Abort(.badRequest, reason: "Missing search term in request")
   }
   
   // Article 모델로 반환 받기 위함 
   let searchResult = req.withPooledConnection(to: .mysql) { conn -> Future<[Article]> in
   
       conn  
       .raw("Select * from Article where title like '%" + search + "%'" )
       .all(decoding: Article.self)
       // 위에서 받은 search 상수로 Article 테이블에서 title 컬럼에서 검색
       
   }

   return searchResult.flatMap({ (result) in
        return try ResponseJSON<[Article]>(data: result).encode(for: req)
        })
   })
}

위에 처럼 코드를 작성해주시면 되는데요, 여기서 중요한 부분은 conn -> Future<[Article]> in인데요

 

해당 부분에서 반환되는 모델을 작성을 잘 작성해주셔야 하고요,

 

conn.raw("raw code").all(decoding: 모델.self) 부분에서 원하는 쿼리문을 미리 사용해본 뒤 적용시켜주시면 되겠습니다!!