[SQL] Node.js 환경에서 SQL 다루기

hosik kim·2022년 2월 5일
0

With CodeStates

목록 보기
43/45
post-thumbnail

💡 Node.js with MySQL


Node.js 환경에서 MySQL에 접속하여 데이터를 다룰 수 있다.
데이터베이스와 서버 인스턴스를 연결하기 위해, mysql모듈을 사용한다.

var mysql = require('mysql')
var connection = mysql.createConnection({
  host: 'example.org',
  user: 'bob',
  password: 'secret',
})

connection.connect(function (err) {
  if (err) {
    console.error('error connecting:' + err.stack)
    return
  }
  
  console.log('connected as id' + connection.threadId)
})

Node.js 환경에서 SQL문을 작성하고 .query() 메소드를 호출하는 것으로 query를 수행할 수 있다.

connection.query(
  'SELECT * FROM `books` WHERE `author` = "David"',
  function (error, results, fields) {
    // 쿼리 중에 오류가 발생하면 error가 된다.
    // result에는 쿼리 결과가 포함된다.
    // field에는 반환된 result(있는 경우)에 대한 정보가 포함된다.
  }
 )

.query(sqlString, callback) 을 사용하여, 첫번째 인자에 SQL문을, 두번째 인자에 콜백함수를 넣는 것으로 사용한다.

connection.query(
  'SELECT' * FROM `books` WHERE `author` = ?',
  ['David'],
  function (error, results, fields) {
    // 쿼리 중에 오류가 발생하면 error가 된다.
    // result에는 쿼리 결과가 포함된다.
    // field에는 반한된 result(있는 경우)에 대한 정보가 포함된다.
  }
)

.quert(sqlString, values, callback) 형식은 placeholder 값을 사용할 때 적용할 수 있다.

SQL문에 물음표(?)로 설정한 위치에 두번째 인자인 David 를 적용하여 위와 동일한 SQL문으로 데이터를 처리한다.

인자로 전달해줄 때 유의할 점은 대괄호([])로 감싸고 전달해줘야하는 점이다.

.query() 의 인자로 전달할 때, 변수를 선언하여 전달할 수 있다. 좀 더 가독성을 향상할 수 있다.

var sql = 'INSERT INTO customers (name, address) VALUES ?'
var params = [
  ['John', 'Highway 71'],
  ['Peter', 'Lowstreet 4'],
  ['Amy', 'Apple st 652'],
  ['Hannah', 'Mountain 21'],
  ['Michael', 'Valley 345'],
  ['Sandy', 'Ocean blvd 2'],
  ['Betty', 'Green Grass 1'],
  ['Richard', 'Sky st 331'],
  ['Susan', 'One way 98'],
  ['Vicky', 'Yellow Garden 2'],
  ['Ben', 'Park Lane 38'],
]
connection.query(sql, [params], function (err, result) {
  if (err) throw err
  console.log('Number of records inserted: ' +
result.affectedRows)
})

💡 post로 삽인한 레코드의 id를 가져오는 방법


클라이언트로부터 테이블에 대한 post 요청이 왔을 때, 그 테이블에 레코드를 삽입한다.

이 때, 이 레코드의 id 를 테이블과 관계를 맺고 있는 다른 테이블에 foreign key 로 삽입해야할 수 있다.

이 때, .query() 를 다중 호출하여 작업을 수행할 수 있다.

post: (userId, orders, totalPrice, callback) => {
  const queryStringOne = 
        `INSERT INTO orders (user_id, total_price)
  VALUES ('${userId}', '${totalPrice}')`
// 클라이언트로부터 orders 테이블에 post 요청을 받았다. SQL문을 작성한다.
  
 connection.query(queryStringOne, (err, result) => {
   // query 메소드를 호출한다.
   const queryStringTwo = 
   `INSERT INTO order_items (order_id, item_id, order_quantity)
    VALUES ?`
  
   // 일대 다 관계로 연결된 order_items 테이블에 foreign key로도 전달해주어야 한다.
   
   const params = orders.map((el) => [result.insertId, el.itemId, el.quantity])
   // foreign key가 order_id인 경우,
   // 첫번째 query 메소드를 호출할 때 result에 담긴 고유 키(result.insertId)를
   // 삽입할 테이블의 order_id 필드에 할당하여 참조하는 키로 전달한다.
   connection.query(queryStringTwo, [params], (err, result) => {
     if (err) callback(err)
     callback(null, result)
   })
 })
}

🔍 refrence


공식 문서

profile
안되면 될 때까지👌

0개의 댓글