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
를 테이블과 관계를 맺고 있는 다른 테이블에 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)
})
})
}