Joins এবং Complex Query তৈরির কৌশল

Relationships এবং Joins - এসকিউএল অ্যালকেমি (SQLAlchemy) - Database Tutorials

342

SQLAlchemy ORM এবং Core ব্যবহার করে Joins এবং Complex Queries তৈরি করা ডেটাবেসের সাথে কাজ করার একটি গুরুত্বপূর্ণ দিক। এই কৌশলগুলো আপনাকে একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করতে এবং ডেটাবেসে জটিল অনুসন্ধান সম্পাদন করতে সাহায্য করবে।


Joins কী এবং SQLAlchemy তে কীভাবে কাজ করে?

Joins ডেটাবেসের মধ্যে দুটি বা তার বেশি টেবিলের মধ্যে সম্পর্ক স্থাপন করে। বিভিন্ন ধরনের Joins রয়েছে:

  • INNER JOIN: দুটি টেবিলের মধ্যে মিল থাকা রেকর্ডগুলোকে ফেরত দেয়।
  • LEFT OUTER JOIN: প্রথম টেবিলের সব রেকর্ড এবং মিল পাওয়া রেকর্ডগুলো ফেরত দেয়।
  • RIGHT OUTER JOIN: দ্বিতীয় টেবিলের সব রেকর্ড এবং মিল পাওয়া রেকর্ডগুলো ফেরত দেয়।
  • FULL OUTER JOIN: দুটি টেবিলের সব রেকর্ড ফেরত দেয়, মিল পাওয়া রেকর্ডগুলোসহ।

SQLAlchemy তে Join কার্যকর করতে, আপনাকে relationship() বা join() ফাংশন ব্যবহার করতে হবে। ORM এবং Core উভয় ক্ষেত্রেই এটি ব্যবহার করা সম্ভব।


SQLAlchemy ORM এ Joins ব্যবহার করা

SQLAlchemy ORM এর মাধ্যমে relationships ব্যবহার করে টেবিলের মধ্যে সম্পর্ক স্থাপন করা যায়। নিচে One-to-Many সম্পর্কের জন্য Join এর উদাহরণ দেখানো হলো:

উদাহরণ:

ধরা যাক, আমাদের দুটি টেবিল User এবং Post আছে, যেখানে One-to-Many সম্পর্ক রয়েছে (একজন ইউজারের অনেক পোস্ট থাকতে পারে)।

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

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

# User টেবিল
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    posts = relationship('Post', back_populates='user')  # Relationship with Post

# Post টেবিল
class Post(Base):
    __tablename__ = 'posts'
    id = Column(Integer, primary_key=True)
    title = Column(String)
    content = Column(String)
    user_id = Column(Integer, ForeignKey('users.id'))  # Foreign Key to User table
    user = relationship('User', back_populates='posts')  # Relationship with User

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

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

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

# কিছু ডেটা ইনসার্ট করা
new_user = User(name="Alice")
session.add(new_user)
session.commit()

new_post1 = Post(title="Post 1", content="Content 1", user_id=new_user.id)
new_post2 = Post(title="Post 2", content="Content 2", user_id=new_user.id)
session.add(new_post1)
session.add(new_post2)
session.commit()

Joins এর মাধ্যমে ডেটা ফেচিং

# Join ব্যবহার করে ইউজারের সাথে পোস্ট ফেচ করা
users_with_posts = session.query(User).join(Post).filter(Post.user_id == User.id).all()

for user in users_with_posts:
    print(user.name)
    for post in user.posts:
        print(f" - {post.title}")

এখানে, session.query(User).join(Post) ব্যবহার করে User এবং Post টেবিলের মধ্যে INNER JOIN করা হয়েছে, যেখানে Post.user_id এবং User.id মিলে যাচ্ছে।


SQLAlchemy Core এ Joins ব্যবহার করা

SQLAlchemy Core ব্যবহার করে join() ফাংশন ব্যবহার করে একই ফলাফল পাওয়া যায়।

from sqlalchemy import Table, MetaData, create_engine, select

# টেবিল ডিফাইন করা
metadata = MetaData()
users = Table('users', metadata,
              Column('id', Integer, primary_key=True),
              Column('name', String))

posts = Table('posts', metadata,
              Column('id', Integer, primary_key=True),
              Column('title', String),
              Column('content', String),
              Column('user_id', Integer, ForeignKey('users.id')))

# ইঞ্জিন তৈরি
engine = create_engine('sqlite:///example.db')

# ডেটাবেসে সংযোগ এবং জয়েন কোয়েরি তৈরি
with engine.connect() as conn:
    query = select([users.c.name, posts.c.title]).select_from(users.join(posts))
    result = conn.execute(query)

    for row in result:
        print(row)

এখানে users.join(posts) ব্যবহার করে INNER JOIN সম্পন্ন করা হয়েছে এবং select() ফাংশন ব্যবহার করে ডেটা রিট্রিভ করা হয়েছে।


Complex Queries (জটিল কোয়েরি) তৈরির কৌশল

SQLAlchemy তে Complex Queries তৈরি করার জন্য একাধিক টেবিলের উপর Joins, Filters, Aggregates, Group By, Having, Subqueries, Window Functions ইত্যাদি ব্যবহার করা যায়। এই কৌশলগুলি ডেটাবেসের জটিল অপারেশন সম্পাদন করতে সহায়ক।

উদাহরণ: Group By এবং Aggregate Functions

from sqlalchemy import func

# ডেটাবেসে Group By এবং Aggregate Function ব্যবহার করা
query = session.query(User.name, func.count(Post.id).label('post_count')).join(Post).group_by(User.name).all()

for row in query:
    print(f"User: {row.name}, Posts: {row.post_count}")

এখানে, func.count(Post.id) ব্যবহার করে COUNT অ্যাগ্রিগেট ফাংশন ব্যবহার করা হয়েছে এবং group_by(User.name) দিয়ে গ্রুপ করা হয়েছে। এটি প্রতিটি ইউজারের পোস্টের সংখ্যা ফিরিয়ে দেয়।


উদাহরণ: Subquery

# Subquery ব্যবহার করা
subquery = session.query(Post.user_id, func.count(Post.id).label('post_count')).group_by(Post.user_id).subquery()

query = session.query(User.name, subquery.c.post_count).join(subquery, subquery.c.user_id == User.id)
for row in query:
    print(f"User: {row.name}, Posts: {row.post_count}")

এখানে, subquery তৈরি করা হয়েছে যা Post টেবিলের প্রতি ইউজারের পোস্টের সংখ্যা গণনা করে এবং তারপর মূল কোয়েরির মধ্যে এটি যুক্ত করা হয়েছে।


সারাংশ

Joins এবং Complex Queries SQLAlchemy তে ডেটাবেসের সাথে কাজ করার একটি শক্তিশালী কৌশল। Joins ব্যবহার করে একাধিক টেবিলের মধ্যে সম্পর্ক স্থাপন করা যায় এবং Complex Queries এর মাধ্যমে Group By, Aggregate Functions, Subqueries, এবং Window Functions ব্যবহার করে জটিল ডেটা বিশ্লেষণ করা যায়। SQLAlchemy ORM এবং Core উভয়ই এই কাজগুলোকে সহজ এবং কার্যকর করে তোলে, যা ডেটাবেস অপারেশনকে আরও নমনীয় ও পারফরম্যান্স-ভিত্তিক করে তোলে।

Content added By
Promotion

Are you sure to start over?

Loading...