On this page
เชื่อม Python กับ DB (sqlite3)
สั่งงานฐานข้อมูลจากโค้ด Python ด้วย sqlite3 ที่มากับ Python — และกัน SQL injection
sqlite3 เป็นฐานข้อมูลที่มากับ Python อยู่แล้ว (ไม่ต้องติดตั้ง server) เก็บทั้งฐานข้อมูลเป็นไฟล์เดียว เหมาะมากสำหรับเรียนรู้และโปรเจกต์เล็ก หัวข้อนี้สอนเชื่อม Python กับ DB และเรื่องสำคัญที่สุด: กัน SQL injection
connect, cursor, execute, commit
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)
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)
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,))ไม่ว่าค่าจะมาจากไหน (ผู้ใช้, ไฟล์, API) อย่าต่อ string เข้า SQL เอง — ส่งค่าผ่าน parameter (?) ทุกครั้ง นี่คือช่องโหว่ความปลอดภัยอันดับต้น ๆ ที่ป้องกันได้ง่ายแต่คนพลาดบ่อย
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 แล้วอธิบายว่าทำไมอันตราย แล้วแก้เป็น ?