🚀 PyMySQL을 사용한 더미 데이터 삽입하기
📌 개요
PyMySQL은 Python에서 MySQL 데이터베이스와 상호작용하는 데 사용되는 라이브러리입니다. 이번 포스팅에서는 Faker 라이브러리를 이용해 더미 데이터를 생성하고, 이를 PyMySQL을 통해 Products, Customers, Orders 테이블에 삽입하는 방법을 실습해보겠습니다.
이를 통해 실제 데이터베이스 환경에서 데이터를 삽입하고 관리하는 방법을 이해할 수 있습니다.
🛠️ 필요한 라이브러리
먼저 필요한 라이브러리를 설치하고 준비해야 합니다.
bash
pip install pymysql faker
- pymysql: MySQL 데이터베이스와 Python 간의 연결을 도와주는 라이브러리입니다.
- faker: 가짜 데이터를 생성해주는 라이브러리로, 테스트 데이터나 샘플 데이터를 생성할 때 유용합니다.
⚙️ 동작 원리
- Faker로 더미 데이터 생성
- Faker 라이브러리를 사용하여 가짜 데이터를 생성합니다.
- 이 데이터는 Products, Customers, Orders 테이블에 삽입됩니다.
- PyMySQL로 데이터베이스 연결
- pymysql.connect()를 사용하여 MySQL 데이터베이스에 연결하고, SQL 쿼리를 실행합니다.
- SQL 쿼리로 데이터 삽입
- 생성된 데이터를 SQL 쿼리로 삽입합니다. 각 테이블에 맞는 데이터를 삽입하는 과정입니다.
💻 전체 코드 흐름
python
import pymysql
from faker import Faker
import random
# Faker 객체 초기화
fake = Faker()
# 데이터베이스 연결 설정
conn = pymysql.connect(
host='localhost', # 데이터베이스 서버 주소
user='root', # 데이터베이스 사용자 이름
password='oz-password', # 데이터베이스 비밀번호
db='airbnb', # 데이터베이스 이름
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
# Products 테이블을 위한 더미 데이터 생성
def generate_product_data(n):
for _ in range(n):
product_name = fake.word().capitalize() + ' ' + fake.word().capitalize()
price = round(random.uniform(10, 100), 2)
stock_quantity = random.randint(10, 100)
create_date = fake.date_time_this_year()
yield (product_name, price, stock_quantity, create_date)
# Customers 테이블을 위한 더미 데이터 생성
def generate_customer_data(n):
for _ in range(n):
customer_name = fake.name()
email = fake.email()
address = fake.address()
create_date = fake.date_time_this_year()
yield (customer_name, email, address, create_date)
# Orders 테이블을 위한 더미 데이터 생성
def generate_order_data(n, customer_ids):
for _ in range(n):
customer_id = random.choice(customer_ids)
order_date = fake.date_time_this_year()
total_amount = round(random.uniform(20, 500), 2)
yield (customer_id, order_date, total_amount)
# 데이터베이스에 데이터 삽입
with conn.cursor() as cursor:
# Products 데이터 삽입
products_sql = "INSERT INTO Products (productName, price, stockQuantity, createDate) VALUES (%s, %s, %s, %s)"
for data in generate_product_data(10):
cursor.execute(products_sql, data)
conn.commit()
# Customers 데이터 삽입
customers_sql = "INSERT INTO Customers (customerName, email, address, createDate) VALUES (%s, %s, %s, %s)"
for data in generate_customer_data(5):
cursor.execute(customers_sql, data)
conn.commit()
# Orders 데이터 삽입
# Customers 테이블에서 ID 목록을 얻어옵니다.
cursor.execute("SELECT customerID FROM Customers")
customer_ids = [row['customerID'] for row in cursor.fetchall()]
orders_sql = "INSERT INTO Orders (customerID, orderDate, totalAmount) VALUES (%s, %s, %s)"
for data in generate_order_data(15, customer_ids):
cursor.execute(orders_sql, data)
conn.commit()
# 데이터베이스 연결 종료
conn.close()
💡 코드 분석
1️⃣ Faker로 더미 데이터 생성
- generate_product_data(), generate_customer_data(), generate_order_data() 함수에서는 각각 Products, Customers, Orders 테이블에 삽입할 데이터를 생성합니다.
- Faker를 활용하여 랜덤한 제품 이름, 가격, 고객 이름, 이메일 등을 생성하고, 이 데이터를 SQL 쿼리에 맞게 반환합니다.
2️⃣ 데이터베이스 연결 및 삽입
- pymysql.connect()로 MySQL 데이터베이스와 연결합니다.
- cursor.execute()를 사용하여 SQL 쿼리를 실행하고, conn.commit()을 통해 데이터를 데이터베이스에 반영합니다.
3️⃣ Orders 테이블 삽입
- Orders 테이블에는 고객의 주문 정보가 삽입됩니다.
- 고객 ID 목록을 Customers 테이블에서 조회하여 랜덤으로 주문을 생성합니다.
🧪 실전 적용 시 유의사항
- 테스트 환경에서만 사용
이 코드는 테스트용 더미 데이터를 생성하는 코드이므로 실제 운영 데이터베이스에는 사용하지 않는 것이 좋습니다. - 데이터베이스 연결 정보 보안
데이터베이스 연결 정보를 코드에 하드코딩하지 않고, 외부 파일이나 환경변수를 사용하는 것이 보안에 좋습니다. - 데이터의 무결성 유지
생성된 데이터가 실제 환경에서 사용할 수 있는지 검증하는 과정이 필요합니다. 예를 들어, 가격이 음수거나 이메일 형식이 잘못될 수 있으므로 검증 로직을 추가하는 것이 좋습니다.
✅ 마무리
- PyMySQL과 Faker를 사용하여 MySQL 데이터베이스에 더미 데이터를 삽입하는 방법을 배웠습니다.
- 이 예제를 통해 테스트용 데이터베이스를 구성하고, 다양한 데이터를 자동으로 생성하여 실습할 수 있었습니다.
🔧 이번 포스팅에서 배운 핵심 포인트
- PyMySQL로 MySQL에 연결하고 쿼리를 실행하는 방법
- Faker를 사용해 랜덤 데이터를 생성하는 방법
- 데이터 삽입 후 commit()으로 변경 사항 반영하는 방법
'Database' 카테고리의 다른 글
Chapter 5-30. Mini Project : 예스24 베스트셀러 데이터 수집 후 데이터 분석하기(1/7) (0) | 2025.03.24 |
---|---|
Database - Chapter 5-28. PyMySQL 연습(3/3) (0) | 2025.03.24 |
Database - Chapter 5-28. PyMySQL 연습(1/3) (0) | 2025.03.24 |
Database - Chapter 4-22. 2) 실습 - mysqlsample data 분석(2/2) (0) | 2025.03.21 |
Database - Chapter 4-22. 2) 실습 - mysqlsample data 분석(1/2) (0) | 2025.03.21 |