DB - pymysql: SELECT

KjjeddΒ·2026λ…„ 1μ›” 19일

DB

λͺ©λ‘ 보기
10/11
post-thumbnail

πŸ” Pythonμ—μ„œ MariaDB 데이터 μ‘°νšŒν•˜κΈ°


🧠 핡심 μš©μ–΄

λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 닀루기 μ‹œμž‘ν•˜λ©΄ 같은 단어듀이 계속 λ°˜λ³΅λœλ‹€.
의미λ₯Ό μ• λ§€ν•˜κ²Œ μ•Œκ³  λ„˜μ–΄κ°€λ©΄, 이후 μ½”λ“œκ°€ μ „λΆ€ ν—·κ°ˆλ¦¬κΈ° μ‹œμž‘ν•œλ‹€.


πŸ“Œ SELECT

SELECTλŠ” μ˜μ–΄ 단어 select(μ„ νƒν•˜λ‹€)μ—μ„œ μ™”λ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ— μ €μž₯된 μˆ˜λ§Žμ€ 데이터 μ€‘μ—μ„œ
ν•„μš”ν•œ κ²ƒλ§Œ κ³¨λΌμ„œ κ°€μ Έμ˜€λŠ” λͺ…령이닀.

[ users ν…Œμ΄λΈ” ]
--------------------------
| id | name | email | age|
--------------------------
|  1 | 철수 | ...   | 25  |
|  2 | 영희 | ...   | 28  |
|  3 | ν›ˆμ΄ | ...   | 22  |
--------------------------

SELECT * FROM users WHERE age >= 25
  

마트 μ§„μ—΄λŒ€μ—μ„œ ν•„μš”ν•œ μƒν’ˆλ§Œ μž₯λ°”κ΅¬λ‹ˆμ— λ‹΄λŠ” 것과 κ°™λ‹€.


πŸ“Œ Cursor (μ»€μ„œ)

cursorλŠ” 라틴어 currere (달리닀)μ—μ„œ μœ λž˜ν–ˆλ‹€.

의미λ₯Ό ν•œ λ¬Έμž₯으둜 μ •λ¦¬ν•˜λ©΄ 이렇닀.

μ»€μ„œ = 쿼리 κ²°κ³Όμ—μ„œ β€œμ§€κΈˆ μ–΄λ””λ₯Ό 읽고 μžˆλŠ”μ§€β€λ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터

쿼리 결과
------------------
[1] 철수, 25   ← cursor
[2] 영희, 28
[3] ν›ˆμ΄, 22
  

λ¬Έμ„œ νŽΈμ§‘κΈ°μ—μ„œ κΉœλΉ‘μ΄λŠ” μ»€μ„œκ°€ ν˜„μž¬ μž…λ ₯ μœ„μΉ˜λ₯Ό 가리킀듯,
DB μ»€μ„œλŠ” κ²°κ³Ό μ§‘ν•©μ—μ„œ ν˜„μž¬ 읽을 μœ„μΉ˜λ₯Ό κΈ°μ–΅ν•œλ‹€.


πŸ“Œ Fetch

fetchλŠ” μ˜μ–΄λ‘œ κ°€μ Έμ˜€λ‹€λΌλŠ” λœ»μ΄λ‹€.

μ»€μ„œκ°€ β€œμœ„μΉ˜β€λΌλ©΄, fetchλŠ” μ‹€μ œ 데이터λ₯Ό 손에 μ₯λŠ” ν–‰μœ„λ‹€.

1️⃣ cursor β†’ μ±… μœ„μΉ˜λ₯Ό 가리킴
2️⃣ fetch  β†’ 책을 μ‹€μ œλ‘œ κΊΌλ‚΄μ˜΄
  

μ»€μ„œ 없이 fetchλŠ” μ‘΄μž¬ν•  수 μ—†λ‹€.
(μœ„μΉ˜λ„ λͺ¨λ₯΄λŠ”λ° 데이터λ₯Ό κ°€μ Έμ˜¬ μˆ˜λŠ” μ—†κΈ° λ•Œλ¬Έ)


πŸ§ͺ κ°€μž₯ λ‹¨μˆœν•œ SELECT μ‹€ν–‰

이제 Python μ½”λ“œλ‘œ 직접 SELECTλ₯Ό μ‹€ν–‰ν•΄λ³΄μž

import pymysql

# 1. λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°
conn = pymysql.connect(
    host="μ„œλ²„μ£Όμ†Œ",
    user="μ‚¬μš©μžλͺ…",
    password="λΉ„λ°€λ²ˆν˜Έ",
    db="λ°μ΄ν„°λ² μ΄μŠ€λͺ…",
    charset="utf8mb4"
)

# 2. μ»€μ„œ 생성
cursor = conn.cursor()

# 3. SELECT μ‹€ν–‰
cursor.execute("SELECT * FROM demo.users")

# 4. κ²°κ³Ό 좜λ ₯
for row in cursor.fetchall():
    print(row)

# 5. μžμ› 정리
cursor.close()
conn.close()

μ‹€ν–‰ κ²°κ³ΌλŠ” μ΄λ ‡κ²Œ λ‚˜μ˜¨λ‹€.

(1, '철수', 'chulsoo@example.com', 25)
(2, '영희', 'younghee@example.com', 28)
(3, 'ν›ˆμ΄', 'hooni@example.com', 22)

각 ν–‰(row)은 νŠœν”Œ(tuple) ν˜•νƒœλ‘œ λ°˜ν™˜λœλ‹€.


🧭 Python ↔ DB 쑰회 흐름 ν•œ λ²ˆμ— 정리

[ Python μ½”λ“œ ]
      β”‚
      β–Ό
1. pymysql.connect()   β†’ DB μ—°κ²°
      β”‚
      β–Ό
2. conn.cursor()       β†’ μ»€μ„œ 생성
      β”‚
      β–Ό
3. cursor.execute()    β†’ SELECT 전달
      β”‚
      β–Ό
4. DB κ²°κ³Ό 생성
      β”‚
      β–Ό
5. cursor.fetch()      β†’ κ²°κ³Όλ₯Ό Python으둜 κ°€μ Έμ˜΄

πŸ“¦ fetch λ©”μ„œλ“œ 비ꡐ

SELECTλ₯Ό μ‹€ν–‰ν–ˆλ‹€κ³  ν•΄μ„œ 데이터가 λ°”λ‘œ Python으둜 λ„˜μ–΄μ˜€μ§€λŠ” μ•ŠλŠ”λ‹€.
μ»€μ„œλŠ” κ²°κ³Όλ₯Ό λ“€κ³  있고, fetchκ°€ 데이터λ₯Ό κΊΌλ‚Έλ‹€.

fetch 방식은 총 μ„Έ κ°€μ§€λ‹€. 상황에 맞게 μ„ νƒν•˜μ§€ μ•ŠμœΌλ©΄ λ©”λͺ¨λ¦¬ 폭탄을 λ§žλŠ”λ‹€.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ λ©”μ„œλ“œ       β”‚ 의미                          β”‚ λ°˜ν™˜ ν˜•νƒœ             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ fetchone() β”‚ 1ν–‰λ§Œ κ°€μ Έμ˜€κΈ°                  β”‚ νŠœν”Œ 1개 / None          β”‚
β”‚ fetchall() β”‚ μ „λΆ€ κ°€μ Έμ˜€κΈ°                   β”‚ νŠœν”Œ 리슀트               β”‚
β”‚ fetchmany  β”‚ nκ°œμ”© λ‚˜λˆ μ„œ κ°€μ Έμ˜€κΈ°             β”‚ νŠœν”Œ 리슀트               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  

πŸ₯„ fetchone()

κ²°κ³Όκ°€ 1κ±΄μž„μ΄ 보μž₯될 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œλ‹€.
주둜 PK(id) μ‘°νšŒμ— μ‚¬μš©ν•œλ‹€.

cursor.execute("SELECT * FROM users WHERE id = 1")
row = cursor.fetchone()

if row:
    print(row)
else:
    print("κ²°κ³Ό μ—†μŒ")
(1, '철수', 'chulsoo@example.com', 25)

κ²°κ³Όκ°€ μ—†μœΌλ©΄ None을 λ°˜ν™˜ν•œλ‹€.
μ˜ˆμ™Έκ°€ μ•„λ‹ˆλΌ Noneμ΄λΌλŠ” 점이 μ€‘μš”ν•˜λ‹€.


🍱 fetchall()

쑰건에 λ§žλŠ” λͺ¨λ“  행을 ν•œ λ²ˆμ— λ©”λͺ¨λ¦¬λ‘œ κ°€μ Έμ˜¨λ‹€.

cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()

print(f"총 {len(rows)}건")

for row in rows:
    print(row)

⚠️ 데이터가 λ§Žμ„μˆ˜λ‘ μœ„ν—˜ν•˜λ‹€

[ DB 결과 100만 건 ]
        ↓
fetchall()
        ↓
Python λ©”λͺ¨λ¦¬ 100만 건 적재 πŸ’₯
  

κ΄€λ¦¬μž νŽ˜μ΄μ§€, ν…ŒμŠ€νŠΈ λ°μ΄ν„°μ²˜λŸΌ ν–‰ μˆ˜κ°€ μ λ‹€λŠ” 게 ν™•μ‹€ν•  λ•Œλ§Œ μ‚¬μš©ν•œλ‹€.


πŸ“¦ fetchmany(n)

λŒ€μš©λŸ‰ 데이터λ₯Ό λ‹€λ£° λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œλ‹€.
κ²°κ³Όλ₯Ό 쑰각 λ‹¨μœ„λ‘œ λ‚˜λˆ μ„œ μ²˜λ¦¬ν•œλ‹€.

cursor.execute("SELECT * FROM users")

while True:
    rows = cursor.fetchmany(2)
    if not rows:
        break

    for row in rows:
        print(row)
[1] 철수
[2] 영희
---
[3] ν›ˆμ΄
[4] 민수
---
  

둜그 처리, 배치 μž‘μ—…, 톡계 μ§‘κ³„μ—μ„œ ν•„μˆ˜μ μœΌλ‘œ μ‚¬μš©λ¨.


🧾 νŠœν”Œ 결과의 문제점

κΈ°λ³Έ μ»€μ„œλŠ” κ²°κ³Όλ₯Ό νŠœν”Œ(tuple)둜 λ°˜ν™˜ν•œλ‹€.

row = (1, '철수', 'chulsoo@example.com', 25)

print(row[1])  # 철수

이 μ½”λ“œμ˜ λ¬Έμ œλŠ” 뭘까?

row[1]  ← 1이 뭘 μ˜λ―Έν•˜λŠ”μ§€ μ½”λ“œλ§Œ 보고 μ•Œ 수 μ—†μŒ
  

컬럼 μˆœμ„œλ₯Ό μ™Έμ›Œμ•Ό ν•˜κ³ ,
컬럼이 ν•˜λ‚˜λΌλ„ λ°”λ€Œλ©΄ μ „λΆ€ μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.


πŸ—‚ DictCursor β€” μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” κ²°κ³Ό

DictCursorλ₯Ό μ‚¬μš©ν•˜λ©΄ κ²°κ³Όλ₯Ό λ”•μ…”λ„ˆλ¦¬λ‘œ λ°›λŠ”λ‹€.

from pymysql.cursors import DictCursor

conn = pymysql.connect(
    host="μ„œλ²„μ£Όμ†Œ",
    user="μ‚¬μš©μžλͺ…",
    password="λΉ„λ°€λ²ˆν˜Έ",
    db="λ°μ΄ν„°λ² μ΄μŠ€λͺ…",
    charset="utf8mb4",
    cursorclass=DictCursor
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")

for row in cursor.fetchall():
    print(f"{row['name']} ({row['email']})")

좜λ ₯ μ˜ˆμ‹œ:

철수 (chulsoo@example.com)
영희 (younghee@example.com)
ν›ˆμ΄ (hooni@example.com)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 방식          β”‚ μ ‘κ·Ό 방법       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ νŠœν”Œ          β”‚ row[1]        β”‚
β”‚ DictCursor   β”‚ row['name']   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  

πŸ‘‰ μ‹€λ¬΄μ—μ„œλŠ” DictCursorκ°€ 사싀상 ν‘œμ€€μ΄λ‹€


πŸ›‘ SQL Injection λ°©μ§€

SQL을 λ¬Έμžμ—΄λ‘œ μ‘°ν•©ν•˜λŠ” μˆœκ°„, λ³΄μ•ˆμ΄ λ¬΄λ„ˆμ§„λ‹€.

# ❌ μ ˆλŒ€ μ“°μ§€ 말 것
name = "철수"
cursor.execute(f"SELECT * FROM users WHERE name = '{name}'")
μž…λ ₯κ°’:
'; DROP TABLE users; --
  
μ‹€ν–‰ SQL:
SELECT * FROM users WHERE name = '';
DROP TABLE users;
  

βœ… νŒŒλΌλ―Έν„° 바인딩

name = "철수"

cursor.execute(
    "SELECT * FROM users WHERE name = %s",
    (name,)
)

pymysql이 μžλ™μœΌλ‘œ μ΄μŠ€μΌ€μ΄ν”„ μ²˜λ¦¬ν•œλ‹€.SQL ꡬ쑰와 값이 λΆ„λ¦¬λœλ‹€.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 방식         β”‚ μ•ˆμ „μ„±                    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ λ¬Έμžμ—΄ μ‘°ν•©    β”‚ ❌ Injection μœ„ν—˜        β”‚
β”‚ %s 바인딩     β”‚ βœ… μ•ˆμ „                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  

🧱 ν•¨μˆ˜λ‘œ μ •λ¦¬ν•˜λŠ” 이유

μ‹€λ¬΄μ—μ„œ DB μ½”λ“œλ₯Ό κ·ΈλŒ€λ‘œ μ“°λŠ” 일은 μ—†λ‹€.
λ°˜λ“œμ‹œ ν•¨μˆ˜λ‘œ 감싼닀.

def get_user_by_id(user_id):
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute(
        "SELECT * FROM users WHERE id = %s",
        (user_id,)
    )

    user = cursor.fetchone()

    cursor.close()
    conn.close()

    return user
  • μž¬μ‚¬μš© κ°€λŠ₯
  • ν…ŒμŠ€νŠΈ 쉬움
  • νŠΈλžœμž­μ…˜ 관리 쉬움
  • μ½”λ“œ 읽기 쉬움

πŸ§ͺ μ‹€μŠ΅

μ§€κΈˆκΉŒμ§€ 배운 SELECT κ°œλ…μ„ μ΄μš©ν•΄μ„œ
μ‹€μ œ μ„œλΉ„μŠ€μ—μ„œ λ°”λ‘œ μ“°λŠ” ν•¨μˆ˜ ν˜•νƒœλ‘œ μ •λ¦¬ν•œλ‹€.

[ 이번 μ‹€μŠ΅μ—μ„œ ν›ˆλ ¨ν•˜λŠ” 것 ]

- SELECT 쑰건 검색
- fetch λ©”μ„œλ“œ 선택 κΈ°μ€€
- κ²°κ³Όκ°€ 없을 λ•Œμ˜ 처리 방식
- DictCursor + %s 바인딩 μŠ΅κ΄€ν™”
  

πŸ”§ 곡톡 μ€€λΉ„ μ½”λ“œ

λ¨Όμ € λͺ¨λ“  ν•¨μˆ˜μ—μ„œ μ‚¬μš©ν•  DB μ—°κ²° ν•¨μˆ˜λ₯Ό μ€€λΉ„ν•œλ‹€.

import pymysql
from pymysql.cursors import DictCursor

def get_connection():
    return pymysql.connect(
        host="μ„œλ²„μ£Όμ†Œ",
        user="μ‚¬μš©μžλͺ…",
        password="λΉ„λ°€λ²ˆν˜Έ",
        db="λ°μ΄ν„°λ² μ΄μŠ€λͺ…",
        charset="utf8mb4",
        cursorclass=DictCursor
    )
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ get_connection() μ—­ν•       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ - DB μ—°κ²° 생성              β”‚
β”‚ - DictCursor κ°•μ œ          β”‚
β”‚ - μ—°κ²° μ„€μ • 쀑앙 관리         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  

β‘  λ‚˜μ΄ λ²”μœ„λ‘œ μ‚¬μš©μž 쑰회

쑰건 검색 + μ—¬λŸ¬ ν–‰ λ°˜ν™˜ λ¬Έμ œλ‹€.
κ²°κ³ΌλŠ” μ—¬λŸ¬ 건일 수 μžˆμœΌλ―€λ‘œ fetchall()을 μ‚¬μš©ν•œλ‹€.

def get_users_by_age_range(min_age, max_age):
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute(
        "SELECT * FROM users WHERE age BETWEEN %s AND %s",
        (min_age, max_age)
    )

    users = cursor.fetchall()

    cursor.close()
    conn.close()

    return users
[ 사고 흐름 ]

- κ²°κ³Όκ°€ 0건일 μˆ˜λ„ 있음
- fetchall()은 κ²°κ³Ό μ—†μœΌλ©΄ []
- ν˜ΈμΆœν•˜λŠ” μͺ½μ—μ„œ len(users)둜 νŒλ‹¨ κ°€λŠ₯
  

μ‚¬μš© μ˜ˆμ‹œ

users = get_users_by_age_range(20, 30)

if not users:
    print("ν•΄λ‹Ή λ‚˜μ΄λŒ€ μ‚¬μš©μž μ—†μŒ")
else:
    for user in users:
        print(user["name"], user["age"])

β‘‘ μ΄λ©”μΌλ‘œ μ‚¬μš©μž 1λͺ… 쑰회

이메일은 μœ λ‹ˆν¬ 값이닀.
κ²°κ³ΌλŠ” 0 λ˜λŠ” 1건 β†’ fetchone()이 μ •λ‹΅

def get_user_by_email(email):
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute(
        "SELECT * FROM users WHERE email = %s",
        (email,)
    )

    user = cursor.fetchone()

    cursor.close()
    conn.close()

    return user
[ 포인트 ]

- κ²°κ³Ό μ—†μŒ β†’ None
- μ˜ˆμ™Έ X, None λ°˜ν™˜
- ν˜ΈμΆœλΆ€μ—μ„œ λΆ„κΈ° 처리
  

μ‚¬μš© μ˜ˆμ‹œ

user = get_user_by_email("chulsoo@example.com")

if user is None:
    print("ν•΄λ‹Ή 이메일 μ‚¬μš©μž μ—†μŒ")
else:
    print(user["name"], user["email"])

β‘’ 전체 μ‚¬μš©μž 수 쑰회

COUNTλŠ” 항상 κ²°κ³Όκ°€ 1행이닀.<
λ”°λΌμ„œ fetchone()을 μ‚¬μš©ν•œλ‹€.

def count_users():
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute("SELECT COUNT(*) AS cnt FROM users")
    result = cursor.fetchone()

    cursor.close()
    conn.close()

    return result["cnt"]
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ COUNT 쿼리 νŠΉμ§•             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ - κ²°κ³ΌλŠ” 무쑰건 1ν–‰           β”‚
β”‚ - 값이 0일 μˆ˜λŠ” 있음          β”‚
β”‚ - None μ•„λ‹˜                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  

μ‚¬μš© μ˜ˆμ‹œ

total = count_users()
print(f"전체 μ‚¬μš©μž 수: {total}")

🧠 κ²°κ³Ό μ—†μŒ 처리 μ „λž΅ 정리

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 상황                       β”‚ λ°˜ν™˜ κ°’              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ fetchone κ²°κ³Ό μ—†μŒ          β”‚ None               β”‚
β”‚ fetchall κ²°κ³Ό μ—†μŒ          β”‚ [] (빈 리슀트)       β”‚
β”‚ COUNT(*)                  β”‚ 0                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  

μ˜ˆμ™Έλ₯Ό λ˜μ§ˆμ§€, None을 λ°˜ν™˜ν• μ§€λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ‚¬ν•­μ— 따라 κ²°μ •ν•œλ‹€.


πŸ” λ³΄μ•ˆ 체크

βœ” λͺ¨λ“  μΏΌλ¦¬λŠ” %s 바인딩 μ‚¬μš©
βœ” μ‚¬μš©μž μž…λ ₯ 직접 SQL에 μ‚½μž… X
βœ” DictCursor μ‚¬μš©μœΌλ‘œ 가독성 확보


βœ… μ‹€μŠ΅ 마무리

  • SELECTλŠ” 항상 κ²°κ³Ό 개수λ₯Ό λ¨Όμ € 생각
  • fetch λ©”μ„œλ“œλŠ” 상황에 맞게 선택
  • κ²°κ³Ό μ—†μŒμ€ "정상 μΌ€μ΄μŠ€"
  • DictCursor + %s = 싀무 κΈ°λ³ΈκΈ°

βœ… 핡심 μš”μ•½

βœ” fetchone β†’ 단건 쑰회
βœ” fetchall β†’ μ†ŒλŸ‰ 데이터
βœ” fetchmany β†’ λŒ€μš©λŸ‰ 데이터
βœ” DictCursor β†’ 싀무 ν•„μˆ˜
βœ” %s 바인딩 β†’ λ³΄μ•ˆ ν•„μˆ˜


profile
Gongbuhaja

0개의 λŒ“κΈ€