SQLAlchemy তে Query Object ব্যবহার করা হয় ডেটাবেস থেকে ডেটা রিড (fetch) করতে এবং SQLAlchemy ORM এর মাধ্যমে ডেটাবেসে বিভিন্ন ধরনের অনুসন্ধান (query) চালানোর জন্য। Query Object একটি Session এর মাধ্যমে ডেটাবেসে query তৈরি এবং পরিচালনা করে, এবং এতে filter, sort, join ইত্যাদি অপারেশন করা যায়।
Query Object এর মূল ধারণা
Query Object হল একটি API যা SQLAlchemy ORM-এ ডেটা রিডিং এবং অনুসন্ধান করতে ব্যবহৃত হয়। এটি ডেটাবেসের টেবিলের উপর বিভিন্ন অপারেশন (যেমন SELECT, JOIN, FILTER, ORDER BY) চালানোর জন্য একটি এলেবোরেটেড পদ্ধতি সরবরাহ করে।
Query Object তৈরির জন্য আপনাকে প্রথমে Session তৈরি করতে হয়। তারপর session.query() ব্যবহার করে টেবিলের উপর query তৈরি করতে হয়। এতে বিভিন্ন ফিল্টার এবং অপশন যেমন filter(), filter_by(), order_by() ইত্যাদি যোগ করা যায়।
Query Object তৈরি করা
Query Object তৈরি করার জন্য Session তৈরি করা এবং এরপর session.query() মেথড ব্যবহার করা হয়।
উদাহরণ:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Integer, String, Column
from sqlalchemy.ext.declarative import declarative_base
# Base ক্লাস তৈরি
Base = declarative_base()
# Users মডেল তৈরি করা
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
# SQLite ডেটাবেস ইঞ্জিন তৈরি
engine = create_engine('sqlite:///example.db', echo=True)
# সেশন তৈরি করা
Session = sessionmaker(bind=engine)
session = Session()
# Query Object তৈরি
query = session.query(User)
এখানে, session.query(User) এর মাধ্যমে User টেবিলের জন্য একটি Query Object তৈরি করা হয়েছে, যা users টেবিলের সমস্ত রেকর্ডে query করতে সক্ষম।
Query Object পরিচালনা
Query Object তৈরি করার পর, আপনি এতে বিভিন্ন মেথড ব্যবহার করে query পরিচালনা করতে পারেন:
- filter(): নির্দিষ্ট শর্তে ডেটা ফিল্টার করতে ব্যবহৃত হয়।
- filter_by(): সরল শর্তের জন্য ব্যবহার করা হয় (ফিল্টারের ক্ষেত্রে যেখানে
=অপারেটর ব্যবহার হয়)। - order_by(): ডেটা সাজানোর জন্য ব্যবহৃত হয়।
- all(): সমস্ত রেকর্ড ফেরত দেয়।
- first(): প্রথম রেকর্ড ফেরত দেয়।
- count(): মোট রেকর্ডের সংখ্যা ফেরত দেয়।
- join(): দুটি টেবিলের মধ্যে সম্পর্ক স্থাপন এবং তাদের মধ্যে ডেটা আনতে ব্যবহৃত হয়।
উদাহরণ:
- ফিল্টারিং:
# User টেবিল থেকে বয়স ৩০ এর বেশি এমন ইউজাররা নিয়ে আসা
users_above_30 = session.query(User).filter(User.age > 30).all()
for user in users_above_30:
print(user.name, user.age)
এখানে filter(User.age > 30) ব্যবহার করে বয়স ৩০ এর বেশি এমন ইউজারদের ফিল্টার করা হয়েছে।
- ফিল্টার_by():
# নামের সাথে 'John' থাকা ইউজার রিড করা
users_named_john = session.query(User).filter_by(name='John').all()
for user in users_named_john:
print(user.name, user.age)
এখানে filter_by() ব্যবহার করা হয়েছে, যেটি সরল শর্তে ফিল্টার করার জন্য উপযোগী।
- ডেটা সাজানো (order_by):
# বয়স অনুসারে সাজানো ইউজারদের তালিকা
users_sorted = session.query(User).order_by(User.age).all()
for user in users_sorted:
print(user.name, user.age)
এখানে order_by(User.age) ব্যবহার করে বয়স অনুসারে ইউজারদের সাজানো হয়েছে।
- প্রথম রেকর্ড পাওয়া (first):
# প্রথম ইউজার রেকর্ড পাওয়া
first_user = session.query(User).first()
print(first_user.name, first_user.age)
এখানে first() ব্যবহার করে শুধুমাত্র প্রথম ইউজার রেকর্ড পাওয়া হয়েছে।
- মোট রেকর্ড সংখ্যা (count):
# ইউজার টেবিলের মোট রেকর্ডের সংখ্যা
user_count = session.query(User).count()
print(f"Total users: {user_count}")
এখানে count() ব্যবহার করে User টেবিলের মোট রেকর্ডের সংখ্যা বের করা হয়েছে।
Query Object এর সাথে Join অপারেশন
SQLAlchemy তে join() ব্যবহার করে দুটি টেবিলের মধ্যে সম্পর্ক স্থাপন করা যায়। এই অপারেশনটি সাধারণত One-to-Many বা Many-to-Many সম্পর্কের জন্য ব্যবহৃত হয়।
উদাহরণ:
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
# Post টেবিল তৈরি করা (যেটি User টেবিলের সাথে সম্পর্কিত)
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id')) # Foreign Key
title = Column(String)
user = relationship("User", backref="posts")
# ইউজার এবং পোস্টের মধ্যে Join করা
posts = session.query(User, Post).join(Post).all()
for user, post in posts:
print(f"User: {user.name}, Post Title: {post.title}")
এখানে, join() মেথড ব্যবহার করে User এবং Post টেবিলের মধ্যে সম্পর্ক স্থাপন করা হয়েছে এবং তাদের মধ্যে ডেটা একসাথে নিয়ে আসা হয়েছে।
Query Performance Optimization
SQLAlchemy তে Query Performance Optimization এর জন্য কিছু কৌশল রয়েছে:
- Lazy Loading vs Eager Loading: সম্পর্কিত অবজেক্টগুলি লোড করার কৌশল যা পারফরম্যান্সের উপর প্রভাব ফেলে।
- Limit and Offset: শুধুমাত্র নির্দিষ্ট সংখ্যক রেকর্ড ফেরত পেতে
limit()এবংoffset()ব্যবহার করা যায়।
# শুধুমাত্র ১০টি ইউজার রেকর্ড নিয়ে আসা
users = session.query(User).limit(10).all()
সারাংশ
SQLAlchemy তে Query Object ব্যবহার করে আপনি ডেটাবেস থেকে ডেটা অনুসন্ধান এবং রিড করতে পারেন। session.query() ব্যবহার করে আপনি সহজেই SQLAlchemy ORM মডেল থেকে ডেটা নিতে পারেন এবং filter, order_by, join ইত্যাদি বিভিন্ন মেথড ব্যবহার করে query পরিচালনা করতে পারেন। Query Object SQLAlchemy তে ডেটা ম্যানিপুলেশনকে আরও সহজ এবং শক্তিশালী করে তোলে।
Read more