SQLite → MySQL মাইগ্রেশন করলে সাধারণত:
👉 models.py, schemas.py, routes/urls.py —
এই ফাইলগুলোতে কোনো পরিবর্তন দরকার হয় না (যদি আপনি ডাটা টাইপ খুব বিশেষভাবে SQLite-নির্ভর কিছু ব্যবহার না করেন)।
👉 শুধু এইগুলো করলেই যথেষ্ট:
- প্রয়োজনীয় লাইব্রেরি ইনস্টল
pip install pymysql mysql-connector-python app/db/session.pyতে DATABASE_URL পরিবর্তনalembic.iniতে DATABASE_URL পরিবর্তন- 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
- MySQL Community Server ডাউনলোড করুন: https://dev.mysql.com/downloads/mysql/
- ইনস্টলার চালান → ডিফল্ট সেটিংস → পাসওয়ার্ড সেট করুন
- 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 তুলনা
| বৈশিষ্ট্য | SQLite | MySQL |
|---|---|---|
| সেটআপ | সহজ | তুলনামূলক জটিল |
| পারফরম্যান্স | ছোট প্রজেক্টের জন্য ভালো | বড় প্রজেক্টের জন্য উপযুক্ত |
| একাধিক ইউজার | সীমিত | পূর্ণ সাপোর্ট |
| প্রোডাকশন ব্যবহার | না | হ্যাঁ |
| ডাটা সাইজ | ছোট | বড় |
🎯 পরবর্তী ধাপ
এখন আপনার প্রজেক্ট MySQL-রেডি! পরবর্তী স্টেপ হিসেবে আপনি:
- 🔄 ব্যাকআপ সিস্টেম সেটআপ করতে পারেন
- 📈 পারফরম্যান্স অপটিমাইজ করতে পারেন
- 📊 মনিটরিং ও লগিং যোগ করতে পারেন
- 🔐 রোল-বেসড ইউজার অ্যাক্সেস তৈরি করতে পারেন
📚 রেফারেন্স
- MySQL Docs: https://dev.mysql.com/doc/
- SQLAlchemy MySQL: https://docs.sqlalchemy.org/en/20/dialects/mysql.html
- PyMySQL: https://pymysql.readthedocs.io/
- Alembic MySQL Guide: https://alembic.sqlalchemy.org/en/latest/dialects/mysql.html
চাইলে আমি এটাকে:
- 🧾 WordPress Gutenberg ব্লক
- 📘 Markdown
- 📢 LinkedIn পোস্ট
ফরম্যাটেও সাজিয়ে দিতে পারি।