Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
134 lines (76 sloc) 13.1 KB

ডাটাবেইজ কুয়েরি, জ্যাঙ্গো ওআরএম এর কুয়েরিসেট এপিআই!

মডেল তৈরি (এবং ডাটাবেইজ তৈরি) করার পর আমাদের কাজ হল সেখানে ডাটা ইনসার্ট করা, সেখানের ডাটা রিড, আপডেট বা ডিলেট করা। জ্যাঙ্গো ওআরএম আমাদেরকে এই কাজগুল করার জন্য সুন্দর একটা এপিআই দেয়, কুয়েরিসেট! কোডে চলে যাই, প্রথমেই কমান্ড প্রম্পট বা টার্মিনালে জ্যাঙ্গো শেল ওপেন করুনঃ

python manage.py shell

পাইথন ইন্টারএকটিভ শেল চালু হবে, সেখানে models.py তে তৈরি করা আমাদের Message মডেল (ক্লাস) ইম্পোর্ট করুনঃ

from myapp.models import Message

আমরা Message মডেল দিয়ে ডাটাবেইজ তৈরি করে ফেলেছি, এখন এই মডেল ব্যবহার করেই সেই ডাটাবেইজ এর অপারেশন গুলো করব। আমরা জানি যে এই মডেলটির প্যারেন্ট ক্লাস হল জ্যাঙ্গোর models.Model ক্লাস। এই মডেল ক্লাসটিই ডাটাবেইজ অপারেশনগুলো করার জন্য আমাদেরকে objects নামে একটা ম্যানেজার (এপিআই) দেয়। আমরা সেটা আমাদের Message ক্লাসে ব্যবহার করব।

প্রথমেই দেখা যাক ডাটাবেইজের সব ডাটা রিড করা যায় কিভাবে, লিখুনঃ

Message.objects.all()

Message ক্লাসের Obojects ম্যানেজার এর all() মেথডকে কল করলাম, এটা আমাদের ডাটাবেইজ কুয়েরি করে সকল ডাটা কুয়েরিসেট হিসেবে রিটার্ন করবে! উপরের কোড লিখে এন্টার করলে আপনি পরের লাইনে এরকম কিছু দেখতে পাবেনঃ

<QuerySet []>

কুয়েরিসেট অবজেক্ট, একটা খালি লিস্ট! খালি থাকার কারণ হল আমরা এখনো ডাটাবেইজে কোন ডাটা রাখিনি। আসুন আগে কিছু ডাটা (মেসেজ আরকি) রাখি। ডাটা ক্রিয়েট করতে এই কমান্ডঃ

Message.objects.create(text=”Hi there! How are You!”)
Message.objects.create(text=”Have a nice day boy!”)
Message.objects.create(text=”Are you Crazy !”)

আমরা তিনটি মেসেজ বা ডাটা তৈরি করলাম, objects ম্যানেজারের create ফাংশন কল করে ডাটা ক্রিয়েট করেছি, ফাংশনের ভেতর কিওয়ার্ড আর্গুমেন্ট হিসেবে ডাটাবেইজের কলামের নাম এবং ফিল্ড ভ্যালু (সেই কলামের ডাটা যেটা হবে) দিয়েছি। এখন আমাদের ডাটাবেইজের Message টেবিলের text কলামে তিনটা ফিল্ড/রো যুক্ত হয়েছে, তিনটা মেসেজ!

এবার যদি আমরা Message.objects.all() কল করি তাহলে এরকম দেখবঃ

<QuerySet [<Message: Hi there! how are you!>, <Message: Have a nice day boy!>, <Message: Are you Crazy!>]>

কুয়েরিসেট লিস্ট, ভিতরে তিনটি আইটেম, আমাদের তিনটি মেসেজ!

Objects এর all() ফাংশনটি সকল আইটেম কুয়েরি করে বের করে। আমরা যদি নির্দিষ্ট কোন একটা আইটেম বের করতে চাই তাহলে get() ফাংশন ব্যবহার করতে পারিঃ

Message.objects.get(id=1)

আমাদের মডেলে যদিও আমরা শুধু text এট্রিবিউট বা কলাম রেখেছিলাম, কিন্তু জ্যাঙ্গো আমাদের জন্য ‘প্রাইমারি কি’ হিসেবে অতিরিক্ত আরেকটা এট্রিবিউট যোগ করে দিয়েছে id নামে। এটা করার কারন হল আমরা কোন ফিল্ডকে প্রাইমারি কি হিসেবে সেট করিনি, কিন্তু জ্যাঙ্গো ওআরএম প্রতিটি মডেলের মধ্যেই একটা ‘প্রাইমারি কি’ আশা করে।

যদিও অতিরিক্ত কলামটির নাম id তবে সেটাকে pk নামেও ডাকা যাবে। pk = Primary Key !

get() ফাংশনটিতে আমরা id=1 দিয়ে বলেছি যে সে যেন আমাদেরকে ঐ ফিল্ডটা রিটার্ন করে যার id এর ভ্যালু হল ১।

Message.objects.get(id=1) লিখলে রিটার্ন আসবেঃ <Message: Hi there! how are you!>

এবার কোন কুয়েরিসেট/লিস্ট আসেনি, বরং একটাই মাত্র অবজেক্ট! আমরা অবজেক্টটি থেকে আমাদের প্রয়োজন অনুযায়ী ফিল্ড ভ্যালু বের করে নিতে পারিঃ

>>> mytext = Message.objects.get(id=1)
<Message: Hi there! how are you!>
>>> mytext.text
“Hi there! How are you!”
>>> mytext.id
1
>>> mytext.pk
1

আমাদের মডেলে যদি আরো ফিল্ড থাকত তাহলে আমরা এভাবে সেগুলোর ভ্যালুও বের করতে পারতাম।

Obojects ম্যানেজারের আরেকটা বহুল ব্যবহৃত মেথড হল filter(), অনেক সময়ই আমাদেরকে নির্দিষ্ট কোন কন্ডিশনের উপর ভিত্তি করে ডাটাবেইজের ডাটা রিড করতে হয়। ফিল্টার মেথড আমাদেরকে সেই কাজটি করতে সাহায্য করেঃ

>>> Message.objects.filter(id=1)
<QuerySet [<Message: Hi there! How are You!>]>

ফিল্টারের মাধ্যমে আমরা বলে দিয়েছি যে ঐ ‘সকল’ অবজেক্ট গুলো বের কর যার আইডি হল ১, ফিল্টারটি একটা কুয়েরিসেট রিটার্ন করেছে এবং যেহেতু ডাটাবেইজে শুধুমাত্র একটি অবজেক্টের id এর মান 1 তাই এই কুয়েরিসেটের ভিতর মাত্র একটি ভ্যালু আছে!

এমন যদি হয় যে ফিল্টারের ভিতরের কন্ডিশনটা একাধিক অবজেক্টের সাথে ম্যাচ করে তাহলে সে সেই সবগুলো অবজেক্টই রিটার্ন করবেঃ

>>> Message.objects.filter(text__icontains=’you’)
<QuerySet [<Message: Hi there! how are you!>, <Message: Are you Crazy!>]>

উপরোক্ত কোডে ফিল্টার করা হচ্ছে ঐ ‘সকল’ অবজেক্টকে যেগুলোর টেক্সট ফিল্ডে ‘you’ স্ট্রিং টি আছে। এটা দুটি অবজেক্টের একটি কুয়েরিসেট রিটার্ন করেছে, কেননা দুটি অবজেক্টের টেক্সট ফিল্ডে ‘you’ স্ট্রিং টি আছে!

মডেলের objects মেথড (কোন মডেলের objects মেথডকে আসলে ‘মডেল ম্যানেজার’ বলে) এর মাধ্যমে আমরা যেমন অবজেক্ট রিড করতে পারি, তেমন কোন অবজেক্ট ক্রিয়েট, আপডেট এবং ডিলেটও করতে পারি! এভাবেঃ

>>> Message.objects.all().count()
3

প্রথমে count() মেথড দিয়ে চেক করে দেখলাম আমাদের মেসেজ মডেলে/টেবিলে কয়টি অবজেক্ট/ফিল্ড আছে! তিনটি আছে!

>>> new_message = Message.obojects.create(text=’today is Friday’)

Objects ম্যানেজারের create() মেথড দিয়ে নতুন অবজেক্ট ক্রিয়েট করলাম, আর্গুমেন্ট হিসেবে text ফিল্ড এর ভ্যালু দিয়ে দিলাম! এবং অবজেক্টটিকে new_message ভেরিয়েবলে রাখলাম!

>>> new_message
<Message: today is Friday>

নতুন অবজেক্ট কল করে দেখলাম ক্রিয়েট হয়েছে কিনা! হয়েছে।

>>> Message.objects.all().count()
4

আবার count() মেথড কল করে চেক করে দেখলাম টেবিলে এখন কয়টি ফিল্ড/অবজেক্ট আছে! এখন আছে চারটি! নতুন অবজেক্ট সহ!

>>> new_message.text
’today is Friday’
>>> new_message.id
4

নতুন অবজেক্টটির text ফিল্ড এর মান আমরা অবজেক্ট ক্রিয়েট করার সময় দিয়ে দিয়েছিলাম, এবং id ফিল্ডটা প্রাইমারি কি হিসেবে জ্যাঙ্গো অটোমেটিক তৈরি করে দিয়েছে!

>>> new_message.text = ‘No, today is Sunday’)
>>> new_message.save()

আমরা পাইথনের ভেরিয়েবলে ভ্যালু এসাইন করার মতই text ফিল্ড এ নতুন ভ্যালু এসাইন করলাম। এবং এটা ডাটাবেইজে সেভ করার জন্য save() মেথড কল করলাম।

>>> new_message.text
‘No, today is Sunday’

এখন আমার সেই অবজেক্ট এর text ফিল্ড কল করে দেখলাম তার ভ্যালুটা কি! সেখানে আপডেটেড ভ্যালুটা দেখা যাচ্ছে। তার মানে আমাদের ফিল্ড/অবজেক্টটা আপডেট হয়ে গেছে।

>>> new_message.delete()
(1, {‘myapp.Message’: 1})

উপ্‌স্‌! আমরা নতুন ক্রিয়েট করা অবজেক্টটা ডিলেট করে দিলাম!!

>>> Message.objects.all().count()
3

অতঃপর আবার চেক করে দেখলাম আমাদের টেবিলে চারটা ফিল্ড থেকে একটা ডিলেট হয়ে এখন তিনটা ফিল্ড আছে!

জ্যাঙ্গো ওআরএম দিয়ে চাইলে আমরা আরো অনেক ধরনের কমপ্লেক্স কুয়েরি করতে পারি, আস্তে আস্তে সব শেখা হবে ইনশাল্লাহ।

মনে রাখবেনঃ জ্যাঙ্গো ওআরএম এ প্রতিটা মডেল হল ডাটাবেইজের একেকটা টেবিল, মডেলের ফিল্ডগুলো হল ডাটাবেইজের টেবিলের কলাম, মডেলের প্রতিটা ইন্সট্যান্স (মডেল থেকে তৈরি করা প্রতিটা অবজেক্ট) হল টেবিলের ফিল্ড বা ডাটা বা ‘রো’ !