MySQL 데이터 넣기 (fs 모듈)

Kyoungchan Cho·2022년 9월 1일
0
post-thumbnail

Intro

위코드 3주차 백엔드 세션 MySQL & SQL 과제 중 아래 테이블을 보고 직접 MySQL 쿼리문을 활용하여 아래처럼 똑같이 만들어야 했다.

mysql> SELECT * FROM users;
+----+-----------+---------------------------+---------------------------------------------------------+------------+---------------------+------------+
| id | name      | email                     | profile_image                                           | password   | created_at          | updated_at |
+----+-----------+---------------------------+---------------------------------------------------------+------------+---------------------+------------+
|  1 | Rebekah   | Glover12345@email.com     | https://github.com/amacneil/dbmate#command-line-options | password   | 2022-07-16 14:15:21 | NULL       |
|  2 | Fabian    | O'Connell12345@email.com  | https://github.com/amacneil/dbmate#command-line-options | password1  | 2022-07-16 14:15:21 | NULL       |
|  3 | Elenor    | Skiles12345@email.com     | https://github.com/amacneil/dbmate#command-line-options | password2  | 2022-07-16 14:15:21 | NULL       |
|  4 | Madge     | Quitzon12345@email.com    | https://github.com/amacneil/dbmate#command-line-options | password3  | 2022-07-16 14:15:21 | NULL       |
|  5 | Zelma     | Kozey12345@email.com      | https://github.com/amacneil/dbmate#command-line-options | password4  | 2022-07-16 14:15:21 | NULL       |
|  6 | Destiney  | Homenick12345@email.com   | https://github.com/amacneil/dbmate#command-line-options | password   | 2022-07-16 14:15:21 | NULL       |
|  7 | Buck      | Spencer12345@email.com    | https://github.com/amacneil/dbmate#command-line-options | password5  | 2022-07-16 14:15:21 | NULL       |
|  8 | Pete      | Smitham12345@email.com    | https://github.com/amacneil/dbmate#command-line-options | password6  | 2022-07-16 14:15:21 | NULL       |
|  9 | Lydia     | Harris12345@email.com     | https://github.com/amacneil/dbmate#command-line-options | password7  | 2022-07-16 14:15:21 | NULL       |
| 10 | Danika    | Gulgowski12345@email.com  | https://github.com/amacneil/dbmate#command-line-options | password8  | 2022-07-16 14:15:21 | NULL       |
| 11 | Eulah     | Murray12345@email.com     | https://github.com/amacneil/dbmate#command-line-options | password9  | 2022-07-16 14:15:21 | NULL       |
| 12 | Beatrice  | Nienow12345@email.com     | https://github.com/amacneil/dbmate#command-line-options | password10 | 2022-07-16 14:15:21 | NULL       |
| 13 | Margarete | Krajcik12345@email.com    | https://github.com/amacneil/dbmate#command-line-options | password11 | 2022-07-16 14:15:21 | NULL       |
| 14 | Nikita    | Kemmer12345@email.com     | https://github.com/amacneil/dbmate#command-line-options | password12 | 2022-07-16 14:15:21 | NULL       |
| 15 | Arnulfo   | Bednar12345@email.com     | https://github.com/amacneil/dbmate#command-line-options | password13 | 2022-07-16 14:15:21 | NULL       |
| 16 | Richie    | Koss12345@email.com       | https://github.com/amacneil/dbmate#command-line-options | passwrod14 | 2022-07-16 14:15:21 | NULL       |
| 17 | River     | Wolf12345@email.com       | https://github.com/amacneil/dbmate#command-line-options | password15 | 2022-07-16 14:15:21 | NULL       |
| 18 | Velma     | Weber12345@email.com      | https://github.com/amacneil/dbmate#command-line-options | password16 | 2022-07-16 14:15:21 | NULL       |
| 19 | Niko      | Ayo12345@email.com        | https://github.com/amacneil/dbmate#command-line-options | password17 | 2022-07-16 14:15:21 | NULL       |
| 20 | Fermin    | Wintheiser12345@email.com | https://github.com/amacneil/dbmate#command-line-options | password18 | 2022-07-16 14:15:21 | NULL       |
+----+-----------+---------------------------+---------------------------------------------------------+------------+---------------------+------------+

mysql> SELECT * FROM posts;
+----+-------------------------+-----------------------------------------------------+---------+---------------------+---------------------+
| id | title                   | content                                             | user_id | created_at          | updated_at          |
+----+-------------------------+-----------------------------------------------------+---------+---------------------+---------------------+
|  1 | 위코드 1일차               | HTML과 CSS 익숙해지기..                                |       1 | 2022-04-10 11:41:36 | 2022-04-23 11:21:44 |
|  2 | 위코드 2일차               | Javascript 기본 문법 학습..                            |       1 | 2022-04-18 11:41:36 | 2022-04-23 11:21:54 |
|  3 | 위코드 3일차               | 웹서비스의 역사와 발전 세션을 듣고..                        |       1 | 2022-05-02 11:41:36 | 2022-04-23 11:22:01 |
|  5 | 자료구조 1번               | BigO Notation이란 무엇인가?                            |       2 | 2022-04-19 11:41:36 | 2022-04-23 11:22:13 |
|  6 | 자료구조 2번               | 시간 복잡도와 공간 복잡도에 대해서..                        |       2 | 2022-04-22 14:12:45 | NULL                |
|  7 | 프론트 개발 입문            | 프론트 입문 HTML이란 무엇인가?                            |       3 | 2022-04-23 11:43:25 | 2022-04-23 11:56:25 |
+----+-------------------------+-----------------------------------------------------+---------+---------------------+---------------------+

-- likes 중간 테이블을 통해서 누가 어떤 게시물을 좋아요하고 있는지 알 수 있습니다.

mysql> SELECT * FROM likes;
+----+---------+---------+---------------------+
| id | user_id | post_id | created_at          |
+----+---------+---------+---------------------+
|  1 |       1 |       3 | 2022-07-16 14:18:26 |
|  2 |       2 |       3 | 2022-07-16 14:18:26 |
|  3 |       3 |       3 | 2022-07-16 14:18:26 |
|  4 |       4 |       3 | 2022-07-16 14:18:26 |
|  5 |       5 |       3 | 2022-07-16 14:18:47 |
|  6 |       6 |       1 | 2022-07-16 14:18:47 |
|  7 |       7 |       2 | 2022-07-16 14:18:47 |
|  8 |       8 |       3 | 2022-07-16 14:18:47 |
|  9 |       9 |       5 | 2022-07-16 14:19:13 |
| 10 |      10 |       2 | 2022-07-16 14:19:13 |
| 11 |      11 |       5 | 2022-07-16 14:19:13 |
| 12 |       1 |       5 | 2022-07-16 14:18:26 |
| 13 |       1 |       7 | 2022-07-16 14:18:26 |
+----+---------+---------+---------------------+

mysql> SELECT * FROM comments;
+----+--------------------------------+---------+---------+---------------------+------------+
| id | content                        | user_id | post_id | created_at          | updated_at |
+----+--------------------------------+---------+---------+---------------------+------------+
|  1 | 저는 내용이 정말 어렵게 느껴지더라구요!  |      11 |       1 | 2022-07-16 14:20:10 | NULL       |
|  2 | HTML, CSS 학습하시는 여러분 화이팅!   |      12 |       1 | 2022-07-16 14:20:10 | NULL       |
|  3 | ....                            |      13 |       1 | 2022-07-16 14:20:10 | NULL       |
|  4 | 자료구조 시작!!                    |       1 |       5 | 2022-07-16 14:20:10 | NULL       |
|  5 | 저도 시작했습니다!!                 |       2 |       5 | 2022-07-16 14:20:10 | NULL       |
|  6 | 자료구조 학습 같이 하실분 계신가요?     |       3 |       5 | 2022-07-16 14:20:10 | NULL       |
+----+---------------------------------+---------+---------+---------------------+------------+

테이블은 4개니까 쿼리문으로 후딱 만들고.. 이제 데이터를 넣어야하는데..
아니 이걸 언제 다 쿼리문에 데이터를 하나씩 대입해서 타이핑해서 넣으라고?

INSERT INTO users (name, email, password, profile_image) VALUES ('Rebekah', 'Glover12345@email.com', 'https://github.com/amacneil/dbmate#command-line-options', 'password')

이런 의미없는 노가다를 위코드에서 시켰을리 없다!

라고 생각하며 떠오른게 Node.js fileSystem 모듈이다.
위 데이터를 하나하나 직접 치지 않고 코드로 작성해 쿼리문을 콘솔로 찍어 활용하는 방법을 소개하겠따.

Step1. fileSync할 .txt 파일만들기

테이블 마다 내용을 복붙해서 .txt 파일을 만들어준다.
예를 들어 users 데이터의 txt 파일이면 필요없는 위에 첫 3 row(테이블 column에 해당하는 내용, 위아 래 칸을 나눈 보더)를 날려주고 usersdata.txt로 저장했다.

Step2. fs모듈로 .txt파일을 불러오고 쿼리문 만들기

onst fileSystem = require('fs');
const { isArrayBuffer } = require('util/types'); //<--질문 필요

const userData = fileSystem.readFileSync("./userdata.txt", "utf-8");
const array = userData.split('| ')

for (let i = 2 ; i < array.length; i = i + 7) 
console.log(`insert into users (name, email, profile_image, password) values ("${array[i].trim()}", "${array[i+1].trim()}", "${array[4].trim()}", "${array[i+3].trim()}");`);
  1. 파일 시스템 모듈을 불러오고
    2. util/types -> 내장 객체에 대한 유형검사 (자동으로 코드 생김, 조사 필요)
  2. 저장한 .txt파일을 readFileSync로 불러온다.
  3. '|'로 split해서 배열로 만들어주고
  4. for 반복문을 통해 필요한 데이터의 Index를 찾아 쿼리문을 작성한다.

Step3. MySQL을 켜서 쿼리문을 복붙해서 데이터를 넣는다.

Step2에서 작성한 코드를 run하면 위 사진 처럼 뜨는데 MySQL에서 복붙해서 넣으면 끝!!

INSERT INTO table_name (column_list)
VALUES
	(value_list_1),
	(value_list_2),
	...
	(value_list_n);

console.log 찍을 쿼리문을 위와 같은 형식으로 작성해주면 한줄에 multiple rows 를 넣을 수 있는데 다 하고 나서 알았따! 필요하신분은 위 쿼리문처럼 수정해서 사용해서 써도 될듯!

마무리

코드 짰던 시간이나 직접 쿼리문을 타이핑해서 데이터를 넣는 시간이나 비슷했을거 같긴 한데...
뭐 배운걸 복습했다는 너낌으로 마무리

profile
https://lying-lettuce-69f.notion.site/KyoungchanCho-Blog-f9f150b9e3be4467a67cf2a21932650d (게시글 자동 비공개 현상으로 일단 노션으로 이동합니다. 소개에서 URL 링크 클릭으로 연결됩니다.)

0개의 댓글