C.W.K.
Stream
Lesson 05 of 10 · published

Row Factory — Dict-like access

~10 min · python, row-factory, ergonomics

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

정수로 row 인덱싱 멈춰

기본값으로 sqlite3 가 row 를 tuple 반환. 컬럼을 인덱스로 access — 깨지기 쉽고, 못 읽고, SELECT 순서 바꾸면 깨짐. Fix 한 줄:

conn.row_factory = sqlite3.Row

이제 각 row 가 sqlite3.Row — 인덱스 또는 컬럼명으로 access 가능, 안정 iteration 순서. Dict 아닌데 dict(row) 로 깔끔 변환 (예: JSON serialize).

Tip: Production 코드 모든 connection 에 row_factory = sqlite3.Row 설정. Runtime overhead 무시 가능; 가독성 win 거대; '컬럼 추가하고 인덱스 shift' 버그 클래스 사라짐.

Code

sqlite3.Row 실전·python
import sqlite3, json

conn = sqlite3.connect('demo.db')
conn.row_factory = sqlite3.Row

row = conn.execute('SELECT id, email, username FROM users LIMIT 1').fetchone()

print(row['email'])              # 'a@x.com' — 이름으로
print(row[1])                    # 'a@x.com' — 인덱스도 됨
print(row.keys())                # ['id', 'email', 'username']

# 진짜 dict 변환 (예: JSON)
print(json.dumps(dict(row)))
Custom row factory — 본인 dataclass 반환·python
import sqlite3
from dataclasses import dataclass

@dataclass
class User:
    id: int
    email: str
    username: str

def user_factory(cursor, row):
    cols = [c[0] for c in cursor.description]
    return User(**dict(zip(cols, row)))

conn = sqlite3.connect('demo.db')
conn.row_factory = user_factory
for user in conn.execute('SELECT id, email, username FROM users'):
    print(user.email)

External links

Exercise

Tuple 반환하던 query 하나 골라. sqlite3.Row 로 connection 전환, 호출 코드 컬럼명 access 로 refactor. 그 다음 dataclass instance 반환하는 custom row factory. 각각 어떤 코드에 쓸지 결정.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.