🎯 Mục tiêu bài dạy & Kế hoạch 60 phút
⏱️ 10' Tình huống: Nhập hợp đồng mới ký vào hệ thống
⏱️ 25' Live Code: INSERT INTO với dấu chấm hỏi ?, SELECT * FROM
⏱️ 20' Thực hành: Thêm và đọc hồ sơ công trình
⏱️ 5' Nghiệm thu & Giải đáp
Mục tiêu: Viết hàm thêm khách hàng nhận dữ liệu từ người dùng, thực thi câu lệnh SQL với tuple tham số an toàn và duyệt các dòng trả về từ cursor.fetchall().
💡 Bẫy lỗi thường gặp & Mẹo sư phạm
- Lỗ hổng SQL Injection: Nghiêm cấm dùng f-string ghép chuỗi SQL như:
f"INSERT INTO KhachHang VALUES ('{ten}')" vì nguy cơ bảo mật. Dạy học viên luôn dùng dấu ? (parameterized query).
🛠️ Bài tập thực hành tại lớp
Bài 1 (Cơ bản): Thêm 2 khách hàng mới vào bảng KhachHang. Sau đó viết câu lệnh SELECT * FROM KhachHang và in danh sách ra màn hình.
Bài 2 (Thực chiến nâng cao): Thêm 1 dự án tương ứng cho khách hàng vừa tạo (lát sàn 650 sqft, trị giá 3,250 USD, trạng thái 'Thi công').
# BUỔI 15: THÊM MỚI VÀ TRUY VẤN HỒ SƠ CÔNG TRÌNH
import sqlite3
def them_khach_hang(ho_ten, sdt, zip_code):
"""Hàm thêm khách hàng mới và trả về ID vừa sinh."""
with sqlite3.connect("cong_trinh.db") as conn:
cursor = conn.cursor()
sql = "INSERT INTO KhachHang (ho_ten, sdt, zip_code) VALUES (?, ?, ?)"
cursor.execute(sql, (ho_ten, sdt, zip_code))
conn.commit()
return cursor.lastrowid
def xem_danh_sach_khach():
"""Hàm truy vấn và in toàn bộ danh sách khách hàng."""
with sqlite3.connect("cong_trinh.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT id, ho_ten, sdt, zip_code, ngay_tao FROM KhachHang")
danh_sach = cursor.fetchall()
print(f"\n{'ID':<4} | {'HỌ VÀ TÊN':<20} | {'SĐT':<12} | {'ZIP':<6}")
print("-" * 50)
for k in danh_sach:
print(f"{k[0]:<4} | {k[1]:<20} | {k[2]:<12} | {k[3]:<6}")
# Thử nghiệm thêm khách hàng mới
id_moi = them_khach_hang("Anh Vũ - Căn hộ Vinhomes", "0988776655", "77001")
print(f"✅ Đã thêm khách hàng mới với mã ID: {id_moi}")
xem_danh_sach_khach()
# Output kiểm tra:
✅ Đã thêm khách hàng mới với mã ID: 1
ID | HỌ VÀ TÊN | SĐT | ZIP
--------------------------------------------------
1 | Anh Vũ - Căn hộ Vinhomes | 0988776655 | 77001