Database Tutorials Querying এবং Data Filtering গাইড ও নোট

287

SQLAlchemy তে Querying এবং Data Filtering ডেটাবেস থেকে তথ্য ফেচ (read) করতে এবং তা প্রক্রিয়া (filter) করতে ব্যবহৃত হয়। SQLAlchemy ORM এর মাধ্যমে ডেটাবেসের রেকর্ডগুলোকে Python অবজেক্ট হিসেবে রূপান্তরিত করা হয় এবং বিভিন্ন কোয়েরি এবং ফিল্টার অপারেশন সম্পাদন করা যায়।


Querying

SQLAlchemy ORM এর Querying ফিচার ব্যবহার করে, আপনি ডেটাবেস থেকে তথ্য (records) এক বা একাধিক টেবিল থেকে অনুসন্ধান (fetch) করতে পারেন। SQLAlchemy তে session.query() মেথডের মাধ্যমে কোয়েরি তৈরি করা হয়।

Querying এর মূল ধারণা:

  • Querying: ডেটাবেসে নির্দিষ্ট শর্তে তথ্য খুঁজে বের করা।
  • session.query(): এটি একটি ORM কোয়েরি তৈরি করতে ব্যবহৃত হয় এবং ডেটাবেস থেকে তথ্য আনতে সাহায্য করে।
  • Filters: কোয়েরি করার সময় filter() অথবা filter_by() ব্যবহার করে নির্দিষ্ট শর্তে ডেটা ফিল্টার করা যায়।

Querying উদাহরণ:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# ইঞ্জিন এবং Session তৈরি
engine = create_engine('sqlite:///example.db')
Session = sessionmaker(bind=engine)
session = Session()

# সকল ইউজারকে রিড করা
users = session.query(User).all()  # সকল User রেকর্ড ফেচ করা
for user in users:
    print(user.name, user.age)

# নির্দিষ্ট বয়সের ইউজার খুঁজে বের করা
age_30_users = session.query(User).filter(User.age == 30).all()  # age 30 এর ইউজার খুঁজে পাওয়া
for user in age_30_users:
    print(user.name, user.age)

# সেশনের কাজ শেষ হওয়া পর সেশন বন্ধ করা
session.close()

এখানে, session.query(User).all() সব User টেবিলের রেকর্ডগুলো ফেচ করছে। পরবর্তী কোয়েরিতে filter(User.age == 30) ব্যবহার করে age 30 এর ইউজারদের খুঁজে বের করা হয়েছে।


Data Filtering

Data Filtering SQLAlchemy তে ডেটাবেস থেকে ফিল্টারড ডেটা আনার জন্য ব্যবহৃত হয়। এটি filter() এবং filter_by() মেথড ব্যবহার করে করা হয়।

filter() vs filter_by()

  • filter(): এটি কন্ডিশনাল ফিল্টার করার জন্য ব্যবহৃত হয়। এখানে ==, >, <, like() ইত্যাদি শর্ত ব্যবহার করা যায়।
  • filter_by(): এটি সিম্পল শর্তের জন্য ব্যবহৃত হয়, যেখানে কন্ডিশনকে সরাসরি প্যারামিটার আকারে দেওয়া হয়। তবে এটি অর্ডারিং বা জটিল কন্ডিশন করতে সক্ষম নয়।

filter() মেথড উদাহরণ:

# বয়স ৩০ এর বেশি ইউজারদের খুঁজে বের করা
users_over_30 = session.query(User).filter(User.age > 30).all()
for user in users_over_30:
    print(user.name, user.age)

# নামের মধ্যে 'John' থাকলে ইউজার খুঁজে বের করা
john_users = session.query(User).filter(User.name.like('%John%')).all()
for user in john_users:
    print(user.name, user.age)

এখানে, User.age > 30 এবং User.name.like('%John%') কন্ডিশন ব্যবহার করে ডেটা ফিল্টার করা হয়েছে। like() মেথডটি pattern matching করতে ব্যবহৃত হয়।

filter_by() মেথড উদাহরণ:

# নাম 'Alice' এর ইউজার খুঁজে বের করা
alice_users = session.query(User).filter_by(name='Alice').all()
for user in alice_users:
    print(user.name, user.age)

এখানে filter_by(name='Alice') সরাসরি নামের ভিত্তিতে ফিল্টারিং করেছে।


Complex Querying এবং Filtering Techniques

SQLAlchemy তে আরও জটিল ফিল্টারিং এবং কোয়েরি করতে AND, OR, NOT, in(), is_() ইত্যাদি শর্ত ব্যবহার করা যায়।

AND এবং OR এর মাধ্যমে ফিল্টারিং:

from sqlalchemy import or_

# বয়স ২৫ এর বেশি অথবা নাম 'John' হলে ইউজার খুঁজে বের করা
users = session.query(User).filter(or_(User.age > 25, User.name == 'John')).all()
for user in users:
    print(user.name, user.age)

এখানে, or_() ব্যবহার করে age > 25 অথবা name == 'John' শর্তে ইউজারদের ফেচ করা হয়েছে।

NOT এবং is_() এর মাধ্যমে ফিল্টারিং:

from sqlalchemy import not_

# বয়স ৩০ এর কম ইউজার খুঁজে বের করা
young_users = session.query(User).filter(not_(User.age >= 30)).all()
for user in young_users:
    print(user.name, user.age)

এখানে not_() ব্যবহার করে age < 30 শর্তে ফিল্টার করা হয়েছে।

in() মেথড ব্যবহার:

# নির্দিষ্ট বয়সের ইউজার খুঁজে বের করা (যেমন 25, 30, 35)
age_range_users = session.query(User).filter(User.age.in_([25, 30, 35])).all()
for user in age_range_users:
    print(user.name, user.age)

এখানে in_() ব্যবহার করে কয়েকটি নির্দিষ্ট বয়সের ইউজারদের ফেচ করা হয়েছে।


Query Performance Optimization

SQLAlchemy তে query performance অপটিমাইজ করার জন্য কিছু কৌশল রয়েছে:

  • Lazy Loading: এটি শুধু তখনই সম্পর্কিত ডেটা লোড করে, যখন সেটি প্রয়োজন হয়।
  • Eager Loading: সম্পর্কিত ডেটা একবারে লোড করা হয়, যাতে পরে আরও ডেটাবেস কোয়েরি না করতে হয়।
  • Selectinload() এবং Joinedload(): এটি রিলেশনাল ডেটা একসাথে লোড করতে ব্যবহৃত হয়।

সারাংশ

SQLAlchemy তে Querying এবং Data Filtering ডেটাবেসের রেকর্ডগুলো অনুসন্ধান এবং ফিল্টার করার জন্য অত্যন্ত গুরুত্বপূর্ণ টুলস। Querying SQLAlchemy ORM এর মাধ্যমে ডেটাবেস থেকে ডেটা ফেচ করার একটি সাধারণ প্রক্রিয়া, এবং Filtering ডেটা সঠিক শর্তে ফিল্টার করার একটি পদ্ধতি। Complex Querying Techniques যেমন AND, OR, in(), not_() ইত্যাদি দিয়ে আরও জটিল ডেটা অনুসন্ধান করা যায়।

Content added By

Query Object তৈরি এবং পরিচালনা

264

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 পরিচালনা করতে পারেন:

  1. filter(): নির্দিষ্ট শর্তে ডেটা ফিল্টার করতে ব্যবহৃত হয়।
  2. filter_by(): সরল শর্তের জন্য ব্যবহার করা হয় (ফিল্টারের ক্ষেত্রে যেখানে = অপারেটর ব্যবহার হয়)।
  3. order_by(): ডেটা সাজানোর জন্য ব্যবহৃত হয়।
  4. all(): সমস্ত রেকর্ড ফেরত দেয়।
  5. first(): প্রথম রেকর্ড ফেরত দেয়।
  6. count(): মোট রেকর্ডের সংখ্যা ফেরত দেয়।
  7. join(): দুটি টেবিলের মধ্যে সম্পর্ক স্থাপন এবং তাদের মধ্যে ডেটা আনতে ব্যবহৃত হয়।

উদাহরণ:

  1. ফিল্টারিং:
# 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) ব্যবহার করে বয়স ৩০ এর বেশি এমন ইউজারদের ফিল্টার করা হয়েছে।

  1. ফিল্টার_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() ব্যবহার করা হয়েছে, যেটি সরল শর্তে ফিল্টার করার জন্য উপযোগী।

  1. ডেটা সাজানো (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) ব্যবহার করে বয়স অনুসারে ইউজারদের সাজানো হয়েছে।

  1. প্রথম রেকর্ড পাওয়া (first):
# প্রথম ইউজার রেকর্ড পাওয়া
first_user = session.query(User).first()
print(first_user.name, first_user.age)

এখানে first() ব্যবহার করে শুধুমাত্র প্রথম ইউজার রেকর্ড পাওয়া হয়েছে।

  1. মোট রেকর্ড সংখ্যা (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 এর জন্য কিছু কৌশল রয়েছে:

  1. Lazy Loading vs Eager Loading: সম্পর্কিত অবজেক্টগুলি লোড করার কৌশল যা পারফরম্যান্সের উপর প্রভাব ফেলে।
  2. 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 তে ডেটা ম্যানিপুলেশনকে আরও সহজ এবং শক্তিশালী করে তোলে।

Content added By

Data Filtering (filter(), filter_by()) এর মাধ্যমে Data Fetching

277

SQLAlchemy তে Data Filtering করা হয় বিভিন্ন ডেটাবেস রেকর্ড থেকে প্রয়োজনীয় ডেটা অনুসন্ধান (fetch) করতে। filter() এবং filter_by() দুটি ফাংশন ব্যবহার করে ডেটাবেসের ডেটা ফিল্টার করা এবং নির্দিষ্ট শর্ত (conditions) অনুসারে ডেটা বের করা যায়। এ দুটি ফাংশনের মধ্যে কিছু পার্থক্য রয়েছে, তবে উভয়ই ডেটাবেসের রেকর্ড ফিল্টার করতে কার্যকরী।


filter() ফাংশন

filter() ফাংশন SQLAlchemy তে একটি অত্যন্ত শক্তিশালী পদ্ধতি, যার মাধ্যমে ডেটা ফিল্টার করা হয় শর্ত অনুসারে। এটি SQLAlchemy Query Object এর একটি অংশ এবং এর মধ্যে Python condition expressions ব্যবহার করা যায়।

filter() এর মাধ্যমে Data Filtering:

  • filter() ফাংশনে SQLAlchemy expression language ব্যবহার করা হয়।
  • শর্তে বিভিন্ন ফাংশন এবং অপারেটর (যেমন ==, >, <, like, ইত্যাদি) ব্যবহার করা যায়।

উদাহরণ (filter()):

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# Base ক্লাস তৈরি
Base = declarative_base()

# Model তৈরি
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# ডেটাবেস ইঞ্জিন তৈরি
engine = create_engine('sqlite:///example.db', echo=True)

# টেবিল তৈরি করা
Base.metadata.create_all(engine)

# Session তৈরি
Session = sessionmaker(bind=engine)
session = Session()

# filter() ব্যবহার করে ডেটা ফিল্টার করা
result = session.query(User).filter(User.age > 25).all()

# ফলাফল প্রিন্ট করা
for user in result:
    print(user.name, user.age)

# Session বন্ধ করা
session.close()

এখানে filter(User.age > 25) দিয়ে age কলামের মান 25 এর বেশি এমন রেকর্ডগুলো ফিল্টার করা হয়েছে। all() ব্যবহার করলে সব মিলানো রেকর্ডগুলো একটি লিস্ট হিসেবে পাওয়া যাবে।


filter_by() ফাংশন

filter_by() ফাংশন SQLAlchemy তে একটি সহজতর পদ্ধতি, যা সরাসরি key-value pairs হিসেবে শর্ত প্রদান করে। এটি Python expression language ব্যবহার না করে সরাসরি column names এর মাধ্যমে ডেটা ফিল্টার করার জন্য উপযোগী।

filter_by() এর মাধ্যমে Data Filtering:

  • filter_by() ব্যবহার করা খুবই সহজ, কারণ এটি শুধুমাত্র কলাম নাম এবং মানের মাধ্যমে ফিল্টার করতে সহায়তা করে।
  • এটি শুধুমাত্র সরল শর্তের জন্য ব্যবহৃত হয়, যেমন সমান (=) শর্ত।

উদাহরণ (filter_by()):

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# Base ক্লাস তৈরি
Base = declarative_base()

# Model তৈরি
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# ডেটাবেস ইঞ্জিন তৈরি
engine = create_engine('sqlite:///example.db', echo=True)

# টেবিল তৈরি করা
Base.metadata.create_all(engine)

# Session তৈরি
Session = sessionmaker(bind=engine)
session = Session()

# filter_by() ব্যবহার করে ডেটা ফিল্টার করা
result = session.query(User).filter_by(age=30).all()

# ফলাফল প্রিন্ট করা
for user in result:
    print(user.name, user.age)

# Session বন্ধ করা
session.close()

এখানে, filter_by(age=30) ব্যবহার করা হয়েছে, যার মাধ্যমে age কলামের মান 30 এমন রেকর্ডগুলো ফিল্টার করা হয়েছে।


filter() এবং filter_by() এর মধ্যে পার্থক্য

ফিচারfilter()filter_by()
শর্তের ধরনPython Expression Language ব্যবহার করে (যেমন ==, >, like, ইত্যাদি)।শুধুমাত্র সরল key-value পেয়ার হিসেবে কাজ করে (যেমন =)।
ব্যবহারজটিল শর্তগুলোর জন্য, যেমন বিভিন্ন অপারেটর ও ফাংশন ব্যবহার করতে হয়।সহজ শর্তের জন্য, যেমন age = 30, name = 'Alice'
ফাংশনালিটিআরও বেশি নমনীয় এবং বিভিন্ন শর্তে কাজ করতে পারে।সরল শর্তে কাজ করে, তবে কিছু কমপ্লেক্স শর্তে এটি কাজ নাও করতে পারে।

Data Fetching with filter() and filter_by()

SQLAlchemy তে ডেটা ফেচ করার জন্য filter() এবং filter_by() দুটি গুরুত্বপূর্ণ পদ্ধতি। এই দুটি পদ্ধতি ব্যবহৃত হয় ডেটাবেসে প্রয়োজনীয় রেকর্ড বা ডেটা ফিল্টার করার জন্য।

  • filter() অনেক বেশি নমনীয় এবং এতে বিভিন্ন শর্ত ও অপারেটর ব্যবহার করা যায়।
  • filter_by() সহজ এবং সরাসরি কলাম ও মান দিয়ে ফিল্টার করা যায়, তবে এটি শুধুমাত্র সরল শর্তের জন্য উপযোগী।

সারাংশ

SQLAlchemy তে filter() এবং filter_by() ফাংশনগুলো ডেটা ফিল্টারিং এবং Data Fetching এর জন্য গুরুত্বপূর্ণ। filter() ফাংশন ব্যবহার করে আপনি জটিল শর্তে ডেটা ফিল্টার করতে পারেন, যেখানে filter_by() সরল শর্তে ডেটা ফিল্টার করার জন্য ব্যবহৃত হয়। এই দুটি পদ্ধতি ডেটাবেস অপারেশনকে আরো কার্যকরী এবং দ্রুত করে তোলে।

Content added By

Complex Querying Techniques (AND, OR, NOT)

321

SQLAlchemy তে AND, OR, এবং NOT হল SQL কিউরির মধ্যে লজিক্যাল অপারেটর, যা ডেটাবেস থেকে আরও জটিল ডেটা filter বা query করতে ব্যবহৃত হয়। এই অপারেটরগুলোর মাধ্যমে আপনি একাধিক শর্ত যোগ করে ডেটা fetch করতে পারেন।

এখানে AND, OR, এবং NOT অপারেটরের ব্যবহার SQLAlchemy ORM এবং Core উভয় পদ্ধতিতে আলোচনা করা হবে।


AND Operator

AND অপারেটর ব্যবহার করে একাধিক শর্ত একসাথে প্রয়োগ করা হয়। সমস্ত শর্ত True হলে তখনই রেকর্ডটি নির্বাচিত হবে। SQLAlchemy তে AND অপারেটর ব্যবহার করার জন্য আপনি একাধিক filter() মেথড একসাথে ব্যবহার করতে পারেন অথবা and_() ফাংশন ব্যবহার করতে পারেন।

উদাহরণ (AND):

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import and_

Base = declarative_base()

# User টেবিল তৈরি
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# ডেটাবেস ইঞ্জিন তৈরি
engine = create_engine('sqlite:///example.db', echo=True)

# টেবিল তৈরি
Base.metadata.create_all(engine)

# সেশন তৈরি
Session = sessionmaker(bind=engine)
session = Session()

# AND অপারেটর ব্যবহার
users = session.query(User).filter(and_(User.age > 25, User.name == "Alice")).all()

for user in users:
    print(user.name, user.age)

এখানে, and_() ফাংশন ব্যবহার করে age > 25 এবং name == "Alice" শর্ত একসাথে প্রয়োগ করা হয়েছে। এই শর্ত দুটি একসাথে পূর্ণ হলে সেই রেকর্ড নির্বাচিত হবে।


OR Operator

OR অপারেটর ব্যবহার করলে যদি কোনো একটি শর্ত True হয়, তবে রেকর্ডটি নির্বাচিত হবে। SQLAlchemy তে OR অপারেটর ব্যবহার করতে or_() ফাংশন ব্যবহার করা হয়।

উদাহরণ (OR):

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import or_

Base = declarative_base()

# User টেবিল তৈরি
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# ডেটাবেস ইঞ্জিন তৈরি
engine = create_engine('sqlite:///example.db', echo=True)

# টেবিল তৈরি
Base.metadata.create_all(engine)

# সেশন তৈরি
Session = sessionmaker(bind=engine)
session = Session()

# OR অপারেটর ব্যবহার
users = session.query(User).filter(or_(User.age < 20, User.name == "Alice")).all()

for user in users:
    print(user.name, user.age)

এখানে, or_() ফাংশন ব্যবহার করে age < 20 অথবা name == "Alice" শর্তের যেকোনো একটি শর্ত সত্য হলে রেকর্ডটি নির্বাচিত হবে।


NOT Operator

NOT অপারেটর একটি শর্তের বিপরীত প্রয়োগ করে। SQLAlchemy তে NOT অপারেটর ব্যবহার করতে not_() ফাংশন ব্যবহার করা হয়। এটি কোন শর্তের বিপরীতে কাজ করে এবং তখনই রেকর্ড নির্বাচিত হয় যখন শর্তটি মিথ্যা হয়।

উদাহরণ (NOT):

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import not_

Base = declarative_base()

# User টেবিল তৈরি
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# ডেটাবেস ইঞ্জিন তৈরি
engine = create_engine('sqlite:///example.db', echo=True)

# টেবিল তৈরি
Base.metadata.create_all(engine)

# সেশন তৈরি
Session = sessionmaker(bind=engine)
session = Session()

# NOT অপারেটর ব্যবহার
users = session.query(User).filter(not_(User.name == "Alice")).all()

for user in users:
    print(user.name, user.age)

এখানে, not_() ফাংশন ব্যবহার করে name != "Alice" শর্ত দেওয়া হয়েছে, অর্থাৎ যেসব ইউজারের নাম Alice নয়, তারা নির্বাচিত হবে।


Complex Queries Combining AND, OR, and NOT

SQLAlchemy তে আপনি একাধিক AND, OR, এবং NOT অপারেটর একসাথে ব্যবহার করে আরও জটিল কুয়েরি তৈরি করতে পারেন। নিচে একটি উদাহরণ দেওয়া হলো যেখানে তিনটি অপারেটর একত্রে ব্যবহৃত হয়েছে।

উদাহরণ (Complex Query):

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import and_, or_, not_

Base = declarative_base()

# User টেবিল তৈরি
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# ডেটাবেস ইঞ্জিন তৈরি
engine = create_engine('sqlite:///example.db', echo=True)

# টেবিল তৈরি
Base.metadata.create_all(engine)

# সেশন তৈরি
Session = sessionmaker(bind=engine)
session = Session()

# Complex Query ব্যবহার
users = session.query(User).filter(
    and_(
        or_(User.age < 30, User.name == "Alice"),
        not_(User.name == "Bob")
    )
).all()

for user in users:
    print(user.name, user.age)

এখানে, or_() এবং not_() এর সাথে AND অপারেটর ব্যবহার করা হয়েছে। কুয়েরি এই শর্তগুলো অনুসরণ করবে:

  • age < 30 অথবা name == "Alice", এবং
  • name != "Bob"

এভাবে একাধিক লজিক্যাল অপারেটর দিয়ে আরও জটিল কুয়েরি তৈরি করা সম্ভব।


সারাংশ

SQLAlchemy তে AND, OR, এবং NOT অপারেটর ব্যবহার করে আপনি বিভিন্ন শর্তের উপর ভিত্তি করে ডেটাবেস থেকে প্রয়োজনীয় ডেটা filter বা fetch করতে পারেন। AND অপারেটর দিয়ে একাধিক শর্ত প্রয়োগ, OR দিয়ে যেকোনো একটি শর্ত পূর্ণ হলে নির্বাচন এবং NOT দিয়ে শর্তের বিপরীত প্রয়োগ করা সম্ভব। SQLAlchemy এই অপারেটরগুলির মাধ্যমে ডেটাবেস অপারেশনকে আরও শক্তিশালী এবং নমনীয় করে তোলে।

Content added By

Query Performance Optimization

261

SQLAlchemy-তে Query Performance Optimization অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ডেটাবেস কুয়েরি গুলোর কার্যকারিতা এবং অ্যাপ্লিকেশনের সামগ্রিক পারফরম্যান্সে উল্লেখযোগ্য প্রভাব ফেলে। একটি অপ্রতিরোধ্য কুয়েরি অ্যাপ্লিকেশনের গতিকে ধীর করে দিতে পারে এবং বড় আকারের ডেটাবেসের ক্ষেত্রে এটি আরও বেশি স্পষ্ট হয়ে ওঠে।

SQLAlchemy তে কুয়েরি অপটিমাইজেশনের জন্য কয়েকটি কৌশল এবং সেরা অনুশীলন রয়েছে, যা ডেটাবেস অপারেশনগুলোকে আরও দ্রুত এবং কার্যকরী করে তোলে।


1. Limit the Number of Queries (কুয়েরির সংখ্যা কমানো)

অতিরিক্ত কুয়েরি ডেটাবেসে অপ্রয়োজনীয় লোড সৃষ্টি করতে পারে, যা অ্যাপ্লিকেশন পারফরম্যান্সে প্রভাব ফেলে। যদি আপনি একাধিক কুয়েরি চালাচ্ছেন, তবে সেগুলোর সংখ্যা কমানোর চেষ্টা করুন।

উদাহরণ:

Bad Example (Multiple Queries):

# একাধিক কুয়েরি চালানো
users = session.query(User).all()
for user in users:
    print(session.query(Address).filter_by(user_id=user.id).all())

এখানে প্রতিটি user রেকর্ডের জন্য আলাদা কুয়েরি চালানো হচ্ছে। এই কৌশলটি পারফরম্যান্সে সমস্যা সৃষ্টি করতে পারে, বিশেষ করে বড় ডেটাবেসের জন্য।

Optimized Example (Single Query with JOIN):

# JOIN ব্যবহার করা
users = session.query(User, Address).join(Address).all()
for user, address in users:
    print(user.name, address.email)

এখানে, JOIN ব্যবহার করে আমরা সমস্ত User এবং তাদের সংশ্লিষ্ট Address রেকর্ড একক কুয়েরিতে একত্রিত করেছি, যা পারফরম্যান্স বৃদ্ধি করে।


2. Eager Loading (এজার লোডিং)

যখন আপনি একাধিক সম্পর্কিত অবজেক্ট লোড করতে চান, তখন Eager Loading ব্যবহার করুন, যা সম্পর্কিত অবজেক্টগুলো একক কুয়েরিতে লোড করতে সহায়তা করে। এটি Lazy Loading থেকে দ্রুত এবং অধিক কার্যকর।

উদাহরণ:

Lazy Loading (Bad Example):

# Lazy Loading: প্রতিটি সম্পর্কিত অবজেক্টের জন্য আলাদা কুয়েরি
user = session.query(User).first()
for address in user.addresses:
    print(address.email)

এখানে, user.addresses লোড করার সময় একাধিক কুয়েরি চলে (প্রতিটি address জন্য আলাদা কুয়েরি)।

Eager Loading (Optimized Example):

# Eager Loading ব্যবহার করা
user = session.query(User).options(joinedload(User.addresses)).first()
for address in user.addresses:
    print(address.email)

এখানে, joinedload ব্যবহার করে সব addresses সম্পর্ক একক কুয়েরিতে লোড করা হয়েছে, ফলে আলাদা কুয়েরি চালানোর প্রয়োজন নেই।


3. Use filter() Instead of filter_by() for Complex Queries

SQLAlchemy তে filter() এবং filter_by() দুটি মেথড রয়েছে, তবে যখন আপনার কুয়েরি জটিল হয় বা ফিল্টারিংয়ে কাস্টম শর্ত প্রযোজ্য হয়, তখন filter() ব্যবহারের পরামর্শ দেওয়া হয়, কারণ এটি অধিক ফ্লেক্সিবিলিটি এবং পারফরম্যান্স প্রদান করে।

উদাহরণ:

Bad Example (Using filter_by() for Complex Queries):

# `filter_by()` সাধারণত সহজ ফিল্টারিংয়ের জন্য ব্যবহৃত হয়
users = session.query(User).filter_by(name="John", age=25).all()

এখানে, filter_by() শুধু সরল ফিল্টার ব্যবহার করার জন্য উপযুক্ত, কিন্তু কাস্টম শর্তের ক্ষেত্রে filter() ব্যবহার করলে আরও কার্যকর হতে পারে।

Optimized Example (Using filter() for Complex Queries):

# `filter()` ব্যবহার করা
users = session.query(User).filter(User.name == "John", User.age == 25).all()

এখানে, filter() ব্যবহার করে আরও জটিল এবং কাস্টম শর্তে ফিল্টারিং করা হয়েছে, যা SQLAlchemy-কে কুয়েরি অপটিমাইজেশন করতে সাহায্য করে।


4. Use Indexes to Speed Up Queries (ইনডেক্স ব্যবহার)

SQLAlchemy স্বয়ংক্রিয়ভাবে কিছু সাধারণ কুয়েরির জন্য ইনডেক্স তৈরি করে না, কিন্তু আপনি Index ব্যবহার করে পারফরম্যান্স উন্নত করতে পারেন, বিশেষত যখন আপনি সুনির্দিষ্ট কলামগুলিতে বার বার কুয়েরি চালাচ্ছেন।

উদাহরণ:

from sqlalchemy import Index

# টেবিলের জন্য ইনডেক্স তৈরি করা
Index('idx_user_name', User.name)

এখানে, User.name কলামে একটি ইনডেক্স তৈরি করা হয়েছে, যা বিশেষ করে বড় ডেটাবেসে সার্চ অপারেশন দ্রুত করবে।


5. Avoid N+1 Query Problem (N+1 কুয়েরি সমস্যা এড়ানো)

N+1 কুয়েরি সমস্যা ঘটে যখন একাধিক কুয়েরি চালানোর কারণে আপনার ডেটাবেসে অত্যধিক লোড আসে। এই সমস্যা এড়াতে, Eager Loading এবং JOIN ব্যবহার করা উচিত।

উদাহরণ:

Bad Example (N+1 Query Problem):

# N+1 সমস্যা: একাধিক কুয়েরি চালানো
users = session.query(User).all()
for user in users:
    print(user.name)
    for address in user.addresses:
        print(address.email)

এখানে, প্রতি User এর জন্য আলাদা কুয়েরি চালানো হচ্ছে, যা N+1 কুয়েরি সমস্যার সৃষ্টি করে।

Optimized Example (Using joinedload to Avoid N+1):

# Eager Loading ব্যবহার করা
users = session.query(User).options(joinedload(User.addresses)).all()
for user in users:
    print(user.name)
    for address in user.addresses:
        print(address.email)

এখানে joinedload ব্যবহার করে সম্পর্কিত সব addresses একক কুয়েরিতে লোড করা হয়েছে, ফলে N+1 কুয়েরি সমস্যা এড়ানো গেছে।


6. Query Caching

SQLAlchemy তে Query Caching ব্যবহার করে কিছু কুয়েরি ফলাফল ক্যাশে রাখা যেতে পারে, যাতে পরবর্তী সময়ে একি কুয়েরি চালানোর জন্য ডেটাবেসে আবার যাওয়া না লাগে। ক্যাশে ব্যবহারের জন্য Query অপটিমাইজেশন সাহায্য করতে পারে।

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine('sqlite:///example.db', echo=True)
Session = sessionmaker(bind=engine)
session = Session()

# ক্যাশে হিট করা
result = session.query(User).filter(User.name == "John").all()

SQLAlchemy ক্যাশে ফিচার স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়, তবে আপনি কাস্টম ক্যাশে ম্যানেজমেন্টও করতে পারেন।


সারাংশ

SQLAlchemy তে Query Performance Optimization ডেটাবেসের সাথে কার্যকরী এবং দ্রুত কাজ করার জন্য খুবই গুরুত্বপূর্ণ। কিছু গুরুত্বপূর্ণ কৌশল হলো:

  • Multiple Queries কমানো: একাধিক কুয়েরির সংখ্যা কমানো এবং JOIN ব্যবহার করা।
  • Eager Loading: সম্পর্কিত ডেটা একবারে লোড করা।
  • Indexes: ইনডেক্স ব্যবহার করা ডেটাবেস কুয়েরি পারফরম্যান্স বাড়ানোর জন্য।
  • Avoiding N+1 Query Problem: Eager Loading এবং JOIN ব্যবহার করে N+1 কুয়েরি সমস্যা এড়ানো।
  • Caching: কিছু কুয়েরি ফলাফল ক্যাশে রাখা।

এই কৌশলগুলো ব্যবহার করে আপনি SQLAlchemy তে কুয়েরি পারফরম্যান্স অপটিমাইজ করতে পারবেন, যাতে ডেটাবেস অপারেশনগুলি দ্রুত এবং কার্যকরী হয়।

Content added By
Promotion

Are you sure to start over?

Loading...