SQLAlchemy তে Event Handling হল এমন একটি ব্যবস্থা যা ডাটাবেস এবং ORM (Object-Relational Mapping) অপারেশনের সময় বিভিন্ন কার্যক্রমের উপর নজর রাখার জন্য ব্যবহৃত হয়। SQLAlchemy এর event-driven architecture ব্যবহার করে আপনি বিভিন্ন ইভেন্টের প্রতি সাড়া দিতে পারেন, যেমন: যখন একটি অবজেক্ট তৈরি করা হয়, ডাটাবেসে ইনসার্ট বা আপডেট হয়, অথবা সেশন কমিট করা হয়।
এটি খুবই কার্যকরী যখন আপনাকে একটি প্রক্রিয়ার উপর কাস্টম আচরণ তৈরি করতে হয় বা ডিবাগিং এবং লগিং করতে হয়।
SQLAlchemy তে Event Handling কীভাবে কাজ করে?
SQLAlchemy তে ইভেন্টগুলি বিশেষ কিছু কার্যক্রমের সাথে যুক্ত থাকে, যেমন:
- Session events: যখন একটি session এর মধ্যে কোনো পরিবর্তন ঘটে, যেমন
before_flush,after_commit, ইত্যাদি। - Mapper events: যখন কোনো ORM ম্যাপিং বা ক্লাস মডেল এ কিছু পরিবর্তন হয়, যেমন
before_insert,after_update, ইত্যাদি। - Engine events: ডাটাবেস ইঞ্জিনে বিভিন্ন কার্যক্রম, যেমন
connect,disconnect, ইত্যাদি।
SQLAlchemy তে ইভেন্ট হ্যান্ডলার তৈরি করা
SQLAlchemy তে ইভেন্ট হ্যান্ডলার তৈরি করতে হলে, আপনি প্রথমে ইভেন্টের প্রতি সাড়া দেওয়ার জন্য একটি ফাংশন বা মেথড তৈরি করবেন এবং তারপর সেটি SQLAlchemy ইভেন্ট সিস্টেমের সাথে নিবন্ধন করবেন।
উদাহরণ: Session event handling
ধরা যাক, আপনি একটি before_flush ইভেন্ট হ্যান্ডল করতে চান, যা সেশনের সমস্ত পরিবর্তন ডাটাবেসে পাঠানোর আগে এক্সিকিউট হবে।
from sqlalchemy import create_engine, event
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import Session
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# একটি সিম্পল মডেল
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
# ইঞ্জিন এবং সেশন তৈরি
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
# Event handler তৈরি
def before_flush(session, flush_context, instances):
print("Flush এর আগে সেশন চেক হচ্ছে!")
# Event হ্যান্ডলার রেজিস্টার করা
event.listen(Session, 'before_flush', before_flush)
# সেশন ব্যবহার করা
session = Session()
new_user = User(name="John Doe")
session.add(new_user)
session.commit()
এখানে before_flush ইভেন্টের সময় before_flush হ্যান্ডলার ফাংশন কল হবে এবং আমরা সেসনটিতে কোন পরিবর্তন হয়েছে কিনা তা দেখতে পারব।
অন্যান্য ইভেন্ট উদাহরণ
- before_insert: যখন কোনো অবজেক্ট ডাটাবেসে ইনসার্ট করার আগে।
def before_insert(mapper, connection, target):
print(f"{target} অবজেক্টটি ইনসার্ট করার আগে!")
event.listen(User, 'before_insert', before_insert)
- after_update: যখন কোনো অবজেক্ট আপডেট করার পর।
def after_update(mapper, connection, target):
print(f"{target} অবজেক্টটি আপডেট হওয়ার পর!")
event.listen(User, 'after_update', after_update)
- after_commit: যখন একটি ট্রানজ্যাকশন সফলভাবে কমিট হয়।
def after_commit(session):
print("ট্রানজ্যাকশন সফলভাবে কমিট হয়েছে!")
event.listen(Session, 'after_commit', after_commit)
ইভেন্ট হ্যান্ডলিং এর সুবিধা
- ডিবাগিং: ইভেন্ট হ্যান্ডলারের মাধ্যমে আপনি সিস্টেমের প্রতিটি অংশে লগ তৈরি করতে পারেন, যা ডিবাগিং এবং মনিটরিং এর জন্য উপকারী।
- কাস্টম আচরণ: আপনি SQLAlchemy এর প্রাক-সংজ্ঞায়িত ইভেন্টগুলো ব্যবহার করে কাস্টম আচরণ তৈরি করতে পারেন, যেমন ডাটাবেসে কিছু ইনসার্ট হওয়ার আগে অটোমেটিক্যালি কিছু ফিল্টার বা পরিবর্তন প্রয়োগ করা।
- অ্যাপ্লিকেশন ইন্টিগ্রেশন: বিভিন্ন লজিক এবং কর্মপ্রবাহ (workflow) কে SQLAlchemy এর ইভেন্ট সিস্টেমের মাধ্যমে ইন্টিগ্রেট করা যায়।
সারাংশ
SQLAlchemy তে Event Handling একটি শক্তিশালী ব্যবস্থা যা আপনাকে আপনার ডাটাবেস ও ORM ইন্টারঅ্যাকশনের সময় কাস্টম কার্যক্রম সম্পাদন করতে সাহায্য করে। এটি ডিবাগিং, লগিং, এবং কাস্টম লজিক প্রয়োগ করার জন্য উপযুক্ত এবং বিভিন্ন ধরনের ইভেন্ট হ্যান্ডল করতে পারে যেমন before_insert, after_commit, before_flush, ইত্যাদি।
Read more