1. Home
  2. FastApi
  3. Basic Fundamental
  4. Day 4 : Mysql Database connection

Day 4 : Mysql Database connection

SQLite → MySQL মাইগ্রেশন করলে সাধারণত:

👉 models.py, schemas.py, routes/urls.py
এই ফাইলগুলোতে কোনো পরিবর্তন দরকার হয় না (যদি আপনি ডাটা টাইপ খুব বিশেষভাবে SQLite-নির্ভর কিছু ব্যবহার না করেন)।

👉 শুধু এইগুলো করলেই যথেষ্ট:

  1. প্রয়োজনীয় লাইব্রেরি ইনস্টলpip install pymysql mysql-connector-python
  2. app/db/session.py তে DATABASE_URL পরিবর্তন
  3. alembic.ini তে DATABASE_URL পরিবর্তন
  4. Alembic migration চালানো

⚠️ কবে models এ পরিবর্তন লাগতে পারে?

শুধু তখনই দরকার হবে যদি:

  • আপনি String() এর সাইজ নির্দিষ্ট করতে চান (MySQL best practice)
  • আপনি SQLite-specific টাইপ ব্যবহার করেছেন
  • আপনি বড় টেক্সট ফিল্ডের জন্য Text() ব্যবহার করতে চান

নাহলে, FastAPI + SQLAlchemy কোড অপরিবর্তিতই থাকবে 🎯


সংক্ষেপে:

models, schemas, routes অপরিবর্তিত
🔁 শুধু session.py + alembic.ini + লাইব্রেরি + migration


MySQL সেটআপ গাইড – SQLite থেকে MySQL এ মাইগ্রেশন (FastAPI + SQLAlchemy)

FastAPI প্রজেক্টে যদি আপনি SQLite ব্যবহার করে থাকেন এবং এখন প্রোডাকশন-গ্রেড ডাটাবেসে যেতে চান, তাহলে MySQL একটি আদর্শ পছন্দ। এই পোস্টে আমরা ধাপে ধাপে দেখব কীভাবে SQLite থেকে MySQL এ মাইগ্রেশন করবেন — কোড, কনফিগারেশন ও বাস্তব উদাহরণসহ।

এই গাইডে আপনি শিখবেন:

  • MySQL ইনস্টল ও সেটআপ
  • SQLAlchemy কানেকশন স্ট্রিং পরিবর্তন
  • Alembic দিয়ে মাইগ্রেশন চালানো
  • SQLite ডাটা MySQL এ মাইগ্রেট করা
  • সাধারণ সমস্যা ও সমাধান

🛠️ ধাপ ০: প্রয়োজনীয় লাইব্রেরি ইনস্টল করুন

MySQL ব্যবহার করতে নিচের প্যাকেজগুলো ইনস্টল করুন:

pip install mysql-connector-python pymysql

কেন এই দুটি প্যাকেজ?

  • mysql-connector-python → MySQL এর অফিসিয়াল ড্রাইভার
  • pymysql → হালকা, জনপ্রিয় এবং SQLAlchemy এর সাথে খুব ভালোভাবে কাজ করে

👉 এই গাইডে আমরা pymysql ব্যবহার করব।


📋 ধাপ ১: MySQL সার্ভার ইনস্টল ও সেটআপ

🪟 Windows

  1. MySQL Community Server ডাউনলোড করুন: https://dev.mysql.com/downloads/mysql/
  2. ইনস্টলার চালান → ডিফল্ট সেটিংস → পাসওয়ার্ড সেট করুন
  3. MySQL সার্ভিস চালু আছে কিনা নিশ্চিত করুন

🐧 Linux (Ubuntu/Debian)

sudo apt update
sudo apt install mysql-server
sudo mysql_secure_installation

🍎 macOS

brew install mysql
brew services start mysql
mysql_secure_installation

🗄️ ধাপ ২: MySQL ডাটাবেস ও ইউজার তৈরি করুন

MySQL এ লগইন করুন:

mysql -u root -p

তারপর নিচের কমান্ডগুলো চালান:

CREATE DATABASE student_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

CREATE USER 'student_user'@'localhost' IDENTIFIED BY 'your_password_here';

GRANT ALL PRIVILEGES ON student_db.* TO 'student_user'@'localhost';

FLUSH PRIVILEGES;

EXIT;

কেন এই সেটআপ?

  • utf8mb4 → বাংলা ও সব ইউনিকোড সাপোর্ট
  • আলাদা ইউজার → নিরাপত্তা বাড়ায়
  • GRANT ALL PRIVILEGES → অ্যাপ্লিকেশনের সব অপারেশন চালাতে পারবে

🔧 ধাপ ৩: SQLAlchemy কানেকশন স্ট্রিং পরিবর্তন

📄 ফাইল: app/db/session.py

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# MySQL কানেকশন স্ট্রিং
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://student_user:your_password_here@localhost:3306/student_db"

engine = create_engine(
    SQLALCHEMY_DATABASE_URL,
    echo=False,
    pool_pre_ping=True,
    pool_size=10,
    max_overflow=20
)

SessionLocal = sessionmaker(
    autocommit=False,
    autoflush=False,
    bind=engine
)

Base = declarative_base()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

গুরুত্বপূর্ণ পয়েন্ট:

  • mysql+pymysql:// → SQLAlchemy কে জানায় কোন ড্রাইভার ব্যবহার হচ্ছে
  • pool_pre_ping=True → কানেকশন ড্রপ হলে স্বয়ংক্রিয়ভাবে রিকভার করে
  • pool_size, max_overflow → প্রোডাকশন পারফরম্যান্স অপ্টিমাইজ করে

📝 ধাপ ৪: মডেল অপ্টিমাইজেশন (MySQL এর জন্য)

📄 ফাইল: app/apps/students/models.py

from sqlalchemy import Column, Integer, String, DateTime
from datetime import datetime
from app.db.session import Base

class Student(Base):
    __tablename__ = "students"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    name = Column(String(100), nullable=False, index=True)
    email = Column(String(255), unique=True, nullable=False, index=True)
    age = Column(Integer, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

কেন এই পরিবর্তন?

  • MySQL এ String() এর সাইজ নির্ধারণ করা ভালো অভ্যাস
  • nullable=False → ডাটা ইন্টিগ্রিটি বজায় রাখে
  • onupdate=datetime.utcnow → অটো আপডেট টাইমস্ট্যাম্প

🚀 ধাপ ৫: Alembic কনফিগারেশন আপডেট

📄 ফাইল: alembic.ini

sqlalchemy.url = mysql+pymysql://student_user:your_password_here@localhost:3306/student_db

📊 ধাপ ৬: প্রথম Migration তৈরি করুন

alembic revision --autogenerate -m "Create students table for MySQL"

🔄 ধাপ ৭: Migration চালান

alembic upgrade head

এতে MySQL ডাটাবেসে টেবিল তৈরি হয়ে যাবে।


✅ ধাপ ৮: টেবিল তৈরি হয়েছে কিনা যাচাই করুন

mysql -u student_user -p student_db
SHOW TABLES;
DESCRIBE students;

▶️ ধাপ ৯: FastAPI সার্ভার চালান

uvicorn app.main:app --reload

এখন আপনার অ্যাপ SQLite এর বদলে MySQL ব্যবহার করছে 🎉


📦 SQLite থেকে MySQL এ ডাটা মাইগ্রেশন

যদি আগের SQLite ডাটাবেসে ডাটা থাকে:


পদ্ধতি ১: SQL ডাম্প ব্যবহার করে

sqlite3 sql_app.db .dump > backup.sql
mysql -u student_user -p student_db < backup.sql

পদ্ধতি ২: Python স্ক্রিপ্ট দিয়ে

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from app.apps.students.models import Student

# SQLite
sqlite_engine = create_engine("sqlite:///./sql_app.db")
SQLiteSession = sessionmaker(bind=sqlite_engine)
sqlite_session = SQLiteSession()

students = sqlite_session.query(Student).all()

# MySQL
mysql_engine = create_engine("mysql+pymysql://student_user:password@localhost:3306/student_db")
MySQLSession = sessionmaker(bind=mysql_engine)
mysql_session = MySQLSession()

for student in students:
    new_student = Student(
        name=student.name,
        email=student.email,
        age=student.age
    )
    mysql_session.add(new_student)

mysql_session.commit()
mysql_session.close()
sqlite_session.close()

print("ডাটা সফলভাবে মাইগ্রেট হয়েছে!")

⚠️ সাধারণ সমস্যা ও সমাধান

❌ Access denied for user

সমাধান:

ALTER USER 'student_user'@'localhost' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;

❌ Can’t connect to MySQL server

সমাধান:

  • Windows → Services থেকে MySQL চালু করুন
  • Linux → sudo systemctl start mysql
  • macOS → brew services start mysql

❌ No module named ‘pymysql’

pip install pymysql

❌ 1071 Specified key was too long

email = Column(String(255), unique=True, index=True)

🔐 নিরাপত্তা টিপস (Environment Variable ব্যবহার করুন)

📄 .env ফাইল:

DATABASE_URL=mysql+pymysql://student_user:your_password@localhost:3306/student_db

📄 app/db/session.py:

import os
from dotenv import load_dotenv

load_dotenv()
SQLALCHEMY_DATABASE_URL = os.getenv("DATABASE_URL")

📄 .gitignore:

.env
*.db
__pycache__/

📊 SQLite বনাম MySQL তুলনা

বৈশিষ্ট্যSQLiteMySQL
সেটআপসহজতুলনামূলক জটিল
পারফরম্যান্সছোট প্রজেক্টের জন্য ভালোবড় প্রজেক্টের জন্য উপযুক্ত
একাধিক ইউজারসীমিতপূর্ণ সাপোর্ট
প্রোডাকশন ব্যবহারনাহ্যাঁ
ডাটা সাইজছোটবড়

🎯 পরবর্তী ধাপ

এখন আপনার প্রজেক্ট MySQL-রেডি! পরবর্তী স্টেপ হিসেবে আপনি:

  • 🔄 ব্যাকআপ সিস্টেম সেটআপ করতে পারেন
  • 📈 পারফরম্যান্স অপটিমাইজ করতে পারেন
  • 📊 মনিটরিং ও লগিং যোগ করতে পারেন
  • 🔐 রোল-বেসড ইউজার অ্যাক্সেস তৈরি করতে পারেন

📚 রেফারেন্স


চাইলে আমি এটাকে:

  • 🧾 WordPress Gutenberg ব্লক
  • 📄 PDF
  • 📘 Markdown
  • 📢 LinkedIn পোস্ট
    ফরম্যাটেও সাজিয়ে দিতে পারি।

How can we help?