Notes & software courses · Free to learn
Aph's Blog
On this page

เชื่อม Python กับ DB (sqlite3)

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

สั่งงานฐานข้อมูลจากโค้ด Python ด้วย sqlite3 ที่มากับ Python — และกัน SQL injection

sqlite3 เป็นฐานข้อมูลที่มากับ Python อยู่แล้ว (ไม่ต้องติดตั้ง server) เก็บทั้งฐานข้อมูลเป็นไฟล์เดียว เหมาะมากสำหรับเรียนรู้และโปรเจกต์เล็ก หัวข้อนี้สอนเชื่อม Python กับ DB และเรื่องสำคัญที่สุด: กัน SQL injection

connect, cursor, execute, commit

python
import sqlite3

conn = sqlite3.connect("app.db")   # เปิด (สร้างไฟล์ถ้ายังไม่มี)
cur = conn.cursor()

cur.execute("""
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        age INTEGER
    )
""")

cur.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Aph", 25))
conn.commit()          # ต้อง commit ถึงจะบันทึกจริง
conn.close()

ดึงข้อมูล (fetch)

python
import sqlite3

conn = sqlite3.connect("app.db")
cur = conn.cursor()

cur.execute("SELECT id, name, age FROM users WHERE age >= ?", (18,))
rows = cur.fetchall()      # คืน list ของ tuple
for row in rows:
    print(row)             # (1, 'Aph', 25)

one = cur.execute("SELECT * FROM users WHERE id = ?", (1,)).fetchone()
conn.close()

SQL Injection — เรื่องที่สำคัญที่สุด

อย่าต่อค่าจากผู้ใช้เข้า SQL ด้วย string เด็ดขาด เพราะผู้ใช้ที่ประสงค์ร้ายส่งโค้ด SQL เข้ามาได้ ใช้ ? placeholder ให้ไลบรารีจัดการแทน (เชื่อมหลัก "อย่าเชื่อ input" จากบท defensive)

python
name = input("ชื่อ: ")

# ❌ อันตรายมาก — SQL injection
cur.execute(f"SELECT * FROM users WHERE name = '{name}'")
# ถ้าผู้ใช้พิมพ์:  ' OR '1'='1   จะดึงทุกแถว / หรือลบตารางได้

# ✅ ใช้ ? placeholder — ปลอดภัย ไลบรารี escape ให้
cur.execute("SELECT * FROM users WHERE name = ?", (name,))
ใช้ ? placeholder เสมอ

ไม่ว่าค่าจะมาจากไหน (ผู้ใช้, ไฟล์, API) อย่าต่อ string เข้า SQL เอง — ส่งค่าผ่าน parameter (?) ทุกครั้ง นี่คือช่องโหว่ความปลอดภัยอันดับต้น ๆ ที่ป้องกันได้ง่ายแต่คนพลาดบ่อย

ใช้ with กับ connection ได้

sqlite3 connection ใช้กับ with ได้ (จากบท Context Manager) เพื่อ commit/rollback อัตโนมัติ: with sqlite3.connect("app.db") as conn:

สรุปหัวข้อนี้

  • sqlite3 มากับ Python เก็บ DB เป็นไฟล์เดียว
  • connect → cursor → execute → commit (ต้อง commit ถึงบันทึก)
  • fetchall() คืนหลายแถว, fetchone() คืนแถวเดียว
  • กัน SQL injection ด้วย ? placeholder เสมอ — อย่าต่อ string เอง
แบบฝึกหัด

1) สร้าง DB sqlite + ตาราง แล้ว insert ข้อมูล 3 แถว 2) ดึงข้อมูลด้วย WHERE + ? placeholder 3) เขียน CRUD ครบ (เพิ่ม/อ่าน/แก้/ลบ) 4) ลองเขียนแบบต่อ string แล้วอธิบายว่าทำไมอันตราย แล้วแก้เป็น ?