Pandas 데이터 <-> MySQL

이전 포스팅에서 만든 데이터프레임을 mySQL과 연동하기 위한 과정이다.

import pandas as pd
from sqlalchemy import create_engine
import pymysql

# db 연결
db = pymysql.connect(host='localhost', user='root', password='비번')
cursor = db.cursor()

# DataFrame을 MySQL 데이터베이스에 저장
try:
    engine = create_engine("mysql+pymysql://root:비번@localhost:포트번호/연결할db")
    데이터프레임이름.to_sql(name="테이블", con=engine, if_exists="replace", index=False)
    print("DataFrame이 성공적으로 MySQL 데이터베이스에 저장되었습니다.")
except Exception as e:
    print("에러 발생:", e)
finally:
    db.close()

 

데이터프레임의 정보가 그대로 mySQL에 저장


Mysql <-> node.js 연동

https://www.npmjs.com/package/mysql2

 

mysql2

fast mysql driver. Implements core protocol, prepared statements, ssl and compression in native JS. Latest version: 3.9.6, last published: 3 days ago. Start using mysql2 in your project by running `npm i mysql2`. There are 4319 other projects in the npm re

www.npmjs.com

여기에 기본적인 사용법이 나와있다.

// Get the client
const mysql = require('mysql2');

// Create the connection to database
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '비번',
  database: '연결할 db',
  dateStrings: true
});

// Using placeholders
connection.query(
  'SELECT * FROM `테이블`',
  ['Page', 45],
  function (err, results) {
    console.log(results);
    results.map((item)=>{
      console.log('key : ', item.key)
      console.log('title : ', item.title)
      console.log('sub_title : ', item.sub_title)
      console.log('img : ', item.img)
    })
  }
);

연결 후 테스트 로그를 찍어보면

잘 연결된 것을 볼 수 있다 !

  • 회원가입 - POST /signup
  • 로그인 - POST /signin
  • 회원 개별 조회 - GET /users/:id
  • 회원 개별 탈퇴 - DELETE /users/:id

회원가입 : POST

app.post('/signup', (req, res) => {
  if (req.body == {}) {
    res.status(400).json({
      message: '입력 값을 다시 확인해주세요.'
    })
  } else {
    db.set(id++, req.body)

    res.status(201).json({
      message: `${db.get(id-1).name}님 환영합니다.`
    })
  }
})

요청 바디에는 id, pwd, name 등이 올 수 있다.

요청 바디로 들어온 회원 정보를 db에 저장하고, 성공했다는 응답 코드를 돌려준다.

id++ 을 하는 이유는 자동으로 1을 올려주기 위함 (하나의 객체를 유니크하게 구별하기 위함)

아직 db랑 연결을 안 하고 설계하는 과정이라 수동으로 하고 있다 . ㅎㅎ


회원 개별 조회 : GET

app.get('/users/:id', (req, res) => {
  const id = parseInt(req.params.id)
  const user = db.get(id)

  if (user == undefined) {
    res.status(404).json({
      message: "회원 정보가 없습니다."
    })
  } else {
    res.status(200).json({
      userId: user.userId,
      name: user.name,
    })
  }
})

 

조회하고 싶은 회원의 id를 params로 받는다.

params는 모두 문자열로 들어오기 때문에 parseInt로 정수로 변환한다.

회원의 id를 db에서 찾고,

존재하지 않는다면 상태코드 404와 회원정보가 없다는 메세지를 보냄

존재한다면 상태코드 200과, id와 일치하는 회원 정보를 응답으로 넘겨준다.


회원 개별 탈퇴

// 회원 개별 탈퇴
app.delete('/users/:id', (req, res) => {
  const id = parseInt(req.params.id)
  const user = db.get(id)

  if (user == undefined) {
    res.status(404).json({
      message: "회원 정보가 없습니다."
    })
  } else {
    db.delete(id)
    res.status(200).json({
      message: `${user.name}님, 다음에 또 뵙겠습니다.`
    })
  }
})

 

회원 개별 조회와 거의 비슷하다.

params로 회원의 id를 받고 있다면 db에서 삭제, 없다면 상태코드 404와 에러 메세지 반환


route를 활용한 코드 리팩토링 - 회원 개별 조회 / 회원 개별 탈퇴

개별조회와 개별탈퇴는 http method만 다르고 url이 같다.

route를 이용해 중복 코드를 줄일 수 있다.

app
  .route('/users/:id')
  .get()
  .delete()

 

중복되는 url을 묶고, 아래 메서드들로 분리 할 수 있다.

각 메서드 괄호 안에는 해당 요청이 들어왔을 때의 실행할 콜백 함수만 넣어주면 된다.

app
  .route('/users/:id')
  // 회원 개별 조회
  .get((req, res) => {
    const id = parseInt(req.params.id)
    const user = db.get(id)
  
    if (user == undefined) {
      res.status(404).json({
        message: "회원 정보가 없습니다."
      })
    } else {
      res.status(200).json({
        userId: user.userId,
        name: user.name,
      })
    }
  })
  // 회원 개별 탈퇴
  .delete((req, res) => {
    const id = parseInt(req.params.id)
    const user = db.get(id)
  
    if (user == undefined) {
      res.status(404).json({
        message: "회원 정보가 없습니다."
      })
    } else {
      db.delete(id)
      res.status(200).json({
        message: `${user.name}님, 다음에 또 뵙겠습니다.`
      })
    }
  })

로그인

1. db를 순회하면서, 요청받은 userId가 db에 있는지 확인

2. 있다면 해당 객체의 정보를 loginUser에 담는다. (없으면 loginUser는 빈 값이 됨)

3. loginUser가 빈 값인지 확인하고, (빈 값이 아니면 > userId가 일치한다는 것)

4. 요청받은 pwd가 해당 userId의 pwd와 같은지 확인

// 로그인
app.post('/signin', (req, res) => {
  var loginUser = {}
  const { userId, password } = req.body

  // userId가 db에 저장된 회원인지 확인
  db.forEach((user, idx)=>{ // data, idx, totalData
    if (user.userId === userId) { // 요청데이터 userId와 db에 있는 userId가 같은지 확인
      loginUser = user 
    }
  })
  
  // userId 값을 못 찾았으면
  if(isExisted(loginUser)) {
    // pwd도 맞는지 비교
    if (loginUser.password === password) {
      console.log('비번도 같아')
    } else {
      console.log('틀렸다.')
    }
  } else {
    console.log('없는 아이디입니다.') 
  }
})

 

 

Object.keys(obj)의 길이가 0이라면, 비어있는 것 (속성 이름이 하나도 존재하지 않는다는 것이기 때문)

Object.keys() > 객체의 속성 이름을 배열로 얻을 수 있는 메서드

// 객체가 비었는지 확인하는 함수
function isExisted(obj) {
  if (Object.keys(obj).length) {
    return true
  } else {
    return false
  }
}

'졸업작품 > Node.js' 카테고리의 다른 글

Express - params, query(쿼리 문자열)  (0) 2024.04.18
RESTful API 및 HTTP 프로토콜 기본 개념  (0) 2024.04.17

+ Recent posts