안녕하세요. 주식투자 관련 지식을 공유하는 인천고래입니다.
금일은 외주 작업 도중에 머리가 복잡하기도 하고 향후 작업을 위한 코드를 정리할 필요성도 대두되어 정리차원에서 글을 올립니다.
아래의 글에서는 파이썬에서 데이터베이스를 관리하는데 유용한 쿼리를 실행하는 방법 2가지 방법을 소개하고 각각의 장단점에 대해 기술을 하도록 하겠습니다.
목차 |
|
1. 쿼리를 cursor로 실행하는 방식
1-1. cursor.execute() 사용 예제
우선 데이터베이스와 연결을 한 후 커서 함수를 실행시킨 후 execute 메서드를 실행시키는 순서로 진행을 하시면 됩니다.
conn = get_db_connection()
cursor = conn.cursor()
try:
cursor.execute(queries['UPDATE_THEME_QUERY'], (new_theme_name, theme_id))
conn.commit() # 🔥 데이터 변경 사항 저장
except Exception as e:
conn.close()
return jsonify({"error": str(e)}), 500
conn.close()
return jsonify({"message": "테마 수정 완료!"})
쿼리는 아래와 같이 선언을 해 놓고 불러와서 사용하는 방식으로 진행을 했습니다.
-- 특정 테마 정보 수정
[UPDATE_THEME_QUERY]
UPDATE Themes SET theme_name = ? WHERE theme_id = ?;
1-2. 특징
- cursor.execute()는 SQL을 직접 실행하는 방식입니다.
- INSERT, UPDATE, DELETE 등 데이터 수정 작업(CRUD의 U/D) 에 적합합니다.
- 실행 후 conn.commit()을 반드시 호출해야 변경 사항이 반영되니 꼭 사용하셔야 합니다.
- 반환값이 없거나, .fetchone(), .fetchall()로 데이터를 직접 가져와야 합니다.
1-3. 사용 목적
- 데이터 추가 / 수정 / 삭제 작업
- 실행 후 commit()을 수행해야 하는 쿼리
- SQL을 세밀하게 제어할 때 사용.
2. 쿼리를 read_sql로 실행하는 방식
2-1. pd.read_sql() 사용 예제 (쿼리 실행 후 DataFrame 변환)
이전과 동일한 형식으로 데이터베이스에 연결한 후에 파라미터와 함께 넘겨주시면 됩니다.
conn = get_db_connection()
try:
df = pd.read_sql(queries["ALL_DATA_QUERY"], conn, params=(target_date, previous_date))
except Exception as e:
conn.close()
return jsonify({"error": "쿼리 실행 실패", "message": str(e)}), 500
conn.close()
2-2. 특징
- pd.read_sql()은 SELECT 쿼리를 실행하고 데이터를 바로 DataFrame으로 변환한다.
- params=(값1, 값2, ...) 형태로 SQL 인자 전달이 가능하다.
- cursor.execute() 방식보다 코드가 간결하고, 추가적인 fetchall()이 필요하지 않다.
- conn.commit()이 필요 없으며, 읽기 전용(SELECT) 작업에 적합하다.
2-3. 사용 목적
- 데이터 조회 (SELECT)
- 결과를 바로 DataFrame으로 변환하고 싶은 경우
- 많은 데이터를 다룰 때 Pandas 기능을 활용하고 싶은 경우
3. 두 방식 비교 정리
cursor.execute() 방식 VS pd.read_sql() 방식을 아래와 같이 비교를 해 보았습니다.
주요 목적 | INSERT, UPDATE, DELETE | SELECT |
데이터 반환 | .fetchall(), .fetchone() 사용해야 함 | DataFrame으로 자동 변환 |
자동 커밋 | ❌ (conn.commit() 필요) | ✅ (조회용이므로 commit() 불필요) |
SQL Injection 방지 | ✅ execute(..., params=(..)) 사용 가능 | ✅ params=(..) 사용 가능 |
코드 간결성 | ❌ (커서 조작 필요) | ✅ (한 줄로 데이터 반환) |
Pandas 활용 | ❌ (리스트로 변환해야 함) | ✅ (바로 사용 가능) |
4. 결론: 언제 어떤 방식을 써야 할까?
📌 cursor.execute() 방식이 적절한 경우
- 데이터 변경 (INSERT, UPDATE, DELETE) 필요할 때
- 쿼리 실행 후 추가적인 로직(예: commit() 후 로그 남기기 등)이 필요한 경우
📌 pd.read_sql() 방식이 적절한 경우
- SELECT 실행 후 결과를 DataFrame으로 변환해야 할 때
- 데이터 분석이나 Pandas 기능을 활용할 때
- 코드가 간결해야 할 때
5. 핵심 요약 🎯
✔ cursor.execute() → 데이터 변경 (INSERT, UPDATE, DELETE)
✔ pd.read_sql() → 데이터 조회 (SELECT) → 바로 DataFrame 변환
✔ conn.commit()은 데이터 변경 시 필수, pd.read_sql()에서는 불필요
✔ 두 방식을 적절히 혼합하여 사용하면 가독성과 유지보수성이 향상됨!
'Python Code' 카테고리의 다른 글
RVI(상대 변동성 지수: Relative Volatility Index) 파이썬 코드 제공 (2) | 2025.01.19 |
---|---|
파이썬에서 인덱스 또는 컬럼을 사용 할 경우 최소/최대 날짜 찾기 (2) | 2025.01.15 |
돈치안 채널(Donchian Channel) 소스 코드를 공개합니다. (0) | 2025.01.14 |
TA-Lib 모듈 설치하기 (부제: 32비트 환경에서 Talib 모듈을 설치하려면) (0) | 2025.01.09 |
캘트너 채널(Keltner Channel) 보조지표, 파이썬 코드 제공 (0) | 2025.01.04 |
댓글