null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
Python으로 MySQL 다루기
Structure
connect
•
pymysql 연결 패턴 정리
db-table
•
DB 만들고 지우는 법
•
테이블 생성과 데이터 타입 선택
write
•
INSERT 단일 행 추가
•
다중 행은 executemany로
read
•
SELECT로 전체 조회하기
•
WHERE로 조건 조회
•
ORDER BY, LIMIT로 정렬과 페이징
advanced
•
UPDATE와 DELETE 패턴
•
NaN → None 변환과 에러 처리
Flow Structure
UPDATE와 DELETE 패턴
10 / 10
Next
☆ Star
↗ Full
NaN → None 변환과 에러 처리
#python
#mysql
#pymysql
#nan
#none
@devpc
|
2026-05-04 12:41:22
|
GET /api/v1/flows/26/nodes/509?fv=1&nv=1
Context:
Flow v1
→
Node v1
0
Views
1
Calls
# NaN → None 변환과 에러 처리 ## ProgrammingError: nan can not be used with MySQL pandas DataFrame에서 읽은 데이터를 MySQL에 넣을 때 자주 나오는 에러다. ``` pymysql.err.ProgrammingError: nan can not be used with MySQL ``` 원인은 Python의 `float('nan')`을 MySQL이 받아들이지 못하기 때문이다. MySQL에서 "없는 값"은 `NULL`이지, `NaN`이 아니다. --- ## 해결법: NaN → None 변환 ```python import pandas as pd df = df.where(pd.notnull(df), None) ``` `pd.notnull(df)`는 값이 NaN인 위치에 `False`를 반환한다. `df.where(조건, None)`은 조건이 `False`인 위치를 `None`으로 대체한다. Python의 `None`은 pymysql이 MySQL의 `NULL`로 변환해준다. --- ## 전체 흐름 예시 ```python import pymysql import pandas as pd import numpy as np # NaN이 포함된 DataFrame df = pd.DataFrame({ 'sensor': ['a', 'b', 'c'], 'value': [1.0, np.nan, 3.0] }) # NaN → None df = df.where(pd.notnull(df), None) rows = list(df.itertuples(index=False, name=None)) # [('a', 1.0), ('b', None), ('c', 3.0)] conn = pymysql.connect( host='localhost', user='root', password='', db='mydb', charset='utf8' ) try: with conn.cursor() as cursor: cursor.executemany( 'INSERT INTO sensor_log (sensor, value) VALUES (%s, %s)', rows ) conn.commit() finally: conn.close() ``` --- ## 에러 처리 패턴 ### OperationalError — 연결 실패 ```python try: conn = pymysql.connect(host='wrong_host', user='root', password='') except pymysql.err.OperationalError as e: print(f"연결 실패: {e}") ``` ### IntegrityError — 중복 키 PRIMARY KEY 또는 UNIQUE 제약 위반 시 발생한다. ```python try: with conn.cursor() as cursor: cursor.execute('INSERT INTO users (id, name) VALUES (%s, %s)', (1, 'alice')) conn.commit() except pymysql.err.IntegrityError as e: conn.rollback() print(f"중복 키 에러: {e}") ``` --- ## 트랜잭션 롤백 여러 쿼리를 묶어서 하나로 처리할 때, 중간에 실패하면 전체를 취소해야 한다. ```python try: with conn.cursor() as cursor: cursor.execute('INSERT INTO orders (item) VALUES (%s)', ('book',)) cursor.execute('UPDATE stock SET qty = qty - 1 WHERE item = %s', ('book',)) conn.commit() except Exception as e: conn.rollback() # 위 두 쿼리 모두 취소 print(f"트랜잭션 실패, 롤백: {e}") finally: conn.close() ``` `autocommit`이 꺼진 상태(pymysql 기본값)에서는 `commit()`을 호출해야 변경이 확정된다. 예외 발생 시 `rollback()`으로 이전 상태로 되돌릴 수 있다.
UPDATE와 DELETE 패턴
Next
// COMMENTS
Newest First
ON THIS PAGE
No content selected.