Emerging Topics: IoT & Software Development
Application Development — Phát triển ứng dụng với Database
Ket noi ung dung (Web/Desktop/Mobile) voi MySQL database: kien truc 3-tier, Python/FastAPI backend, REST API, ORM, va input validation.
Application Development — Phát triển ứng dụng với Database
Ứng dụng thực tế kết nối database qua database connector, không phải MySQL Workbench trực tiếp.
1. Kiến trúc 3-Tier
Ba tầng: Presentation (UI: Web/Desktop/Mobile) ↔ Application (Business logic: Python/FastAPI) ↔ Data (MySQL database).
2. Kết nối Python với MySQL
import mysql.connector
db = mysql.connector.connect(
host='localhost', user='app_user',
password='securePass123', database='archery_db'
)
cursor = db.cursor()SELECT
cursor.execute('SELECT ArcherID, ArcherName FROM Archer')
archers = cursor.fetchall()
for a in archers:
print(a[0], a[1])INSERT (Prepared Statement — an toan)
query = 'INSERT INTO Score (ArcherID, RoundID, TotalScore) VALUES (%s, %s, %s)' cursor.execute(query, (archer_id, round_id, total)) db.commit()
3. FastAPI REST API
from fastapi import FastAPI
app = FastAPI()
@app.get('/archers')
def get_archers():
cursor.execute('SELECT * FROM Archer')
return cursor.fetchall()
@app.post('/scores')
def add_score(data: dict):
cursor.execute('INSERT INTO Score VALUES (%s,%s,%s)',
(data['archer_id'], data['round_id'], data['total']))
db.commit()
return {'id': cursor.lastrowid}4. Use Case: Archery Score App
Ứng dung ghi diem ban cung (vi du tu bai giang):
- Chon Archer tu danh sach (SELECT FROM Archer)
- Chon Round & Range (SELECT JOIN)
- Nhap diem tung mui ten (6 arrows/end)
- Luu vao database (INSERT + COMMIT)
- Xem Personal Bests: MAX(TotalScore) GROUP BY ArcherID
Personal Best Query
SELECT a.ArcherName, a.Equipment,
MAX(s.TotalScore) AS PersonalBest,
MAX(s.ScoreDate) AS DateAchieved
FROM Archer a
INNER JOIN Score s ON a.ArcherID = s.ArcherID
GROUP BY a.ArcherID, a.ArcherName, a.Equipment
ORDER BY PersonalBest DESC;5. Client-side Validation
function validateArcherID() {
var id = document.getElementById('archerid').value;
var regex = /^[0-9]+$/;
if (!regex.test(id)) { alert('ArcherID must be numeric.'); }
}Lua y: Client-side validation co the bi bypass. Server phai validate lai.
6. ORM — SQLAlchemy
from sqlalchemy.orm import Session, declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class Archer(Base):
__tablename__ = 'archer'
archer_id = Column(Integer, primary_key=True)
name = Column(String(100))
with Session(engine) as session:
archers = session.query(Archer).all()