๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์˜ค๋ฅ˜ ํ•ด๊ฒฐ

MYSQL์— ํ•œ๊ธ€ csv ํŒŒ์ผ importํ•˜๊ธฐ (์ „์ฒ˜๋ฆฌ ์—†์ด!)

by syLim___ 2024. 11. 14.
728x90

์•„์นด๋ฐ๋ฏธ ์ˆ˜์—…์‹œ๊ฐ„์— https://jumin.mois.go.kr/ ์—์„œ ๋‹ค์šด๋ฐ›์€ csv ํŒŒ์ผ์„ Mysql์— import  ํ•ด์•ผํ•˜๋Š” ์‹ค์Šต์ด ์žˆ์—ˆ๋‹ค.

Datagrip์œผ๋กœ ํŽธํ•˜๊ฒŒ ์ƒฅ ๋„ฃ์–ด๋ฒ„๋ฆฌ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ

csv ํŒŒ์ผ ์ปฌ๋Ÿผ๋ช…์ด ํ•œ๊ธ€์ด์–ด์„œ ๊ธ€์ž๊ฐ€ ๋‹ค ๊นจ์ง€๊ณ  ๋‚œ๋ฆฌ๊ฐ€ ๋‚ฌ๋‹ค.

 

๊ทธ์™€์ค‘์— Mysql Workbench๋กœ ์ž‘์—…ํ•˜๋Š” ํ•™์ƒ๋ถ„๊ป˜์„œ ์งˆ๋ฌธ์„ ํ•˜์…”์„œ

Datagrip๊ฐ™์€ ํˆด์˜ ๋„์›€ ์—†์ด ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์–ด๋งŒ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์ด๊ฒƒ์ €๊ฒƒ ์ฐพ์•„๋ณด์•˜๋‹ค.

 

1๏ธโƒฃ ํŒŒ์ผ๋ช…๊ณผ ํŒŒ์ผ ์ธ์ฝ”๋”ฉ ์„ค์ •

์šฐ์„  ํŒŒ์ผ ์ด๋ฆ„๋ถ€ํ„ฐ ํ•œ๊ธ€ํŒŒ์ผ์ด๋ผ์„œ ํ„ฐ๋ฏธ๋„์—์„œ ํŒŒ์ผ๋ช…์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‰ฝ์ง€ ์•Š์•˜๋‹ค.

 

ใ…Žใ…Ž ๊ทธ๋ž˜์„œ ๋‹ค์šด๋ฐ›์€ ํŒŒ์ผ ์ด๋ฆ„์„ ์˜์–ด(population_202410_1.csv)๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ ,

 

ํ˜น์‹œ ๋ชฐ๋ผ์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ํŒŒ์ผ ์ž์ฒด์˜ ์ธ์ฝ”๋”ฉ ๋˜ํ•œ utf-8๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

iconv -f euc-kr -t utf-8 population_202410_1.csv > population_202410_utf8.csv

 

2๏ธโƒฃ ๋„์ปค Mysql ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๋กœ csv ํŒŒ์ผ ์ด๋™

์ธ์ฝ”๋”ฉ ์„ค์ •๊นŒ์ง€ ๋งˆ์นœ ํŒŒ์ผ์„ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์ž„์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์ฃผ์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ LOAD DATA INFILE ... ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ MYSQL ์— ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” ํ…Œ์ด๋ธ”๋กœ csv ํŒŒ์ผ์„ import ํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ์ž [HY000][1290] The MySQL server is running with the --secure-file-priv option so it cannot execute this statement ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

 

์ด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” MYSQL ์„œ๋ฒ„๊ฐ€ --secure-file-priv ์˜ต์…˜์œผ๋กœ ์„ค์ •๋˜์–ด, ํ—ˆ์šฉ๋œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ๋ถ€ํ„ฐ๋งŒ ํŒŒ์ผ์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด์—ˆ๋‹ค.

 

ํ—ˆ์šฉ๋œ ๋””๋ ‰ํ† ๋ฆฌ๋“ค ๋ชฉ๋ก์€ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

SHOW VARIABLES LIKE 'secure_file_priv';

์‹คํ–‰ ๊ฒฐ๊ณผ ํ˜„์žฌ MySQL ์„ค์ •์ƒ์œผ๋กœ๋Š” /var/lib/mysql-files/ ํ•˜์œ„์— ์žˆ๋Š” ํŒŒ์ผ๋“ค๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค.

 

๊ทธ๋ž˜์„œ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ /var/lib/mysql-files/ ๊ฒฝ๋กœ๋กœ csv ํŒŒ์ผ์„ ๋‹ค์‹œ ์˜ฎ๊ฒจ์ฃผ์—ˆ๋‹ค.

 

3๏ธโƒฃ ์ปฌ๋Ÿผ ํƒ€์ž…๊ณผ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ผ์น˜์‹œ์ผœ csv ํŒŒ์ผ importํ•˜๊ธฐ

๋“œ๋””์–ด csvํŒŒ์ผ์„ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๋กœ ์˜ฎ๊ฒผ์œผ๋‹ˆ, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” ํ…Œ์ด๋ธ”๋กœ import ํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.

LOAD DATA INFILE '/var/lib/mysql-files/population_202410_utf8.csv'
INTO TABLE MonthlyPopulation
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(region, total_population, household_count, population_per_household, male_population, female_population, gender_ratio);

 

 

๊ทธ๋Ÿฌ์ž [01000][1265] Data truncated for column 'total_population' at row 1 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค..

ํ•ด๋‹น ์—๋Ÿฌ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ผ๊ณ  ํ•œ๋‹ค.

 

๐Ÿ“Œ ์—๋Ÿฌ ์›์ธ

 

์ฒ˜์Œ์—๋Š” csv ํŒŒ์ผ์˜ ์ฒซ๋ฒˆ์งธ ์ค„ ๋•Œ๋ฌธ์ธ ์ค„ ์•Œ์•˜๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ฒซ๋ฒˆ์งธ ์ค„์€ IGNORE 1 ROWS ๋ฅผ ์ ์–ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐˆ ๊ฒƒ์ด๋‹ค.

 

์ฆ‰ ์—๋Ÿฌ ๋ฐœ์ƒ ์›์ธ์€ ์ฒซ ๋ฒˆ์งธ ์ค„ ๋•Œ๋ฌธ์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์›๋ณธ csv ํŒŒ์ผ์„ ์ข€ ๋” ์ž์„ธํžˆ ๋œฏ์–ด๋ณด๋‹ˆ ์ˆซ์ž๋ฐ์ดํ„ฐ์— ์ฝค๋งˆ(,)๊ฐ€ ์‚ฝ์ž…๋˜์–ด ์žˆ์—ˆ๋‹ค.

csv ํŒŒ์ผ์„ ์—‘์…€๋กœ ์—ด์–ด์„œ ์—‘์…€์—์„œ ์ฝค๋งˆ๋ฅผ ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•ด์ค€ ๊ฑด ์ค„ ์•Œ์•˜๋Š”๋ฐ, csvํŒŒ์ผ ์ž์ฒด์— ์ฝค๋งˆ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

 

ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ์—์„œ๋Š” ์ด์ธ๊ตฌ์ˆ˜ ์ปฌ๋Ÿผ๊ณผ ์„ธ๋Œ€์ˆ˜ ์ปฌ๋Ÿผ์ด int๋กœ ์ •์˜๋˜์–ด ์žˆ์ง€๋งŒ,

csv ํŒŒ์ผ์—์„œ๋Š” ์ˆซ์ž๋“ค ์‚ฌ์ด์‚ฌ์ด์— ์ฝค๋งˆ๊ฐ€ ์‚ฝ์ž…๋˜์–ด ์žˆ๋‹ค ๋ณด๋‹ˆ ๊ฐ ์†์„ฑ๋“ค์„ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด๋กœ ์ธ์‹ํ•ด๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค.

 

์ฆ‰ String ๋ฐ์ดํ„ฐ๋ฅผ int ์ปฌ๋Ÿผ์— ์ง‘์–ด๋„ฃ์œผ๋ ค๊ณ  ํ•˜๋‹ˆ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์•ˆ ๋งž์•„์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ๊ฒƒ.

 

๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ ๋กœ๋“œํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์—ฌ

LOAD DATA INFILE '/var/lib/mysql-files/population_202410_utf8.csv'
INTO TABLE MonthlyPopulation
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(@region, @total_population, @household_count, @population_per_household, @male_population, @female_population, @gender_ratio)
SET
    region = @region,
    total_population = CAST(REPLACE(@total_population, ',', '') AS UNSIGNED),
    household_count = CAST(REPLACE(@household_count, ',', '') AS UNSIGNED),
    population_per_household = @population_per_household,
    male_population = CAST(REPLACE(@male_population, ',', '') AS UNSIGNED),
    female_population = CAST(REPLACE(@female_population, ',', '') AS UNSIGNED),
    gender_ratio = @gender_ratio;

 

์ˆซ์ž๋กœ ๋“ค์–ด๊ฐ€์•ผ ํ•˜์ง€๋งŒ ๋ฌธ์ž์—ด๋กœ ์ธ์‹๋œ ์†์„ฑ๊ฐ’๋“ค์„ ์ผ์ผํžˆ ์ˆซ์ž ํƒ€์ž…์œผ๋กœ ์บ์ŠคํŒ…ํ•ด์ฃผ๋„๋ก ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

 

๊ทธ๋Ÿฌ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ import๋˜์—ˆ๋”ฐ.

 

 

์ด๋ ‡๊ฒŒ ์ „์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ csv ํŒŒ์ผ์„ DB์— ๋ฐ”๋กœ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ๋ถˆํŽธํ•˜๊ณ  ๋น„ํšจ์œจ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์ง„ํ–‰ํ•ด๋ณธ ์‹ค์Šต์ด๋ผ๊ณ  ํ•œ๋‹ค.

728x90