পাইথন দিয়ে এপিআই ব্যবহার – ৩য় পর্ব

আমরা আবহাওয়ার তথ্য সংগ্রহ ও সংরক্ষণ করার জন্য একটি প্রোগ্রাম মোটামুটি দাঁড় করিয়ে ফেলেছি। প্রোগ্রামটি Open Weather API ব্যবহার করে বর্তমান সময়ের তাপমাত্রা ও আর্দ্রতার তথ্য সংগ্রহ করে। তারপর সেটি ডেটাবেজে সংরক্ষণ করে। আমরা এখানে বেশ কয়েকটি কাজ করছি, কিন্তু সবগুলো কাজ একই জায়গায় করছি। আমাদের উচিত, কাজগুলো আলাদা ফাংশনে করা এবং ফাংশনগুলো এমনভাবে তৈরি করা যেন একটি ফাংশন একটি নির্দিষ্ট কাজ করে।

আমাদের প্রথম কাজটি ছিল ডেটাবেজ টেবিল তৈরি করা। তারপরের কাজ হচ্ছে আবহাওয়ার তথ্য সংগ্রহ করা। সবশেষের কাজ হচ্ছে আবহাওয়ার তথ্য ডেটাবেজে সংরক্ষণ করা। তাহলে আমরা প্রতিটি কাজের জন্য আলাদা ফাংশন তৈরি করতে পারি।

আমি নিচে ফাংশনগুলো দেখিয়ে দিলাম। ফাংশনগুলো পুরোপুরি তৈরি করার দায়িত্ব পাঠকের।

def create_table():
   pass


def get_weather_data():
   pass


def store_weather_data():
   pass


if __name__ == "__main__":
   # create database connection
   conn = sqlite3.connect('example.db')
   c = conn.cursor()

   # create table if it doesn't exist
   create_table()

   # get weather info from open weather map api
   temperature, humidity = get_weather_data()

   # store weather data into database
   store_weather_data(temperature, humidity)

   # close database connection
   conn.close()

ওপরের কোডকে আমরা বলতে পারি মডিউলার (modular) কোড। প্রোগ্রামটি এখন পড়তে ও বুঝতে আগের চেয়ে সহজ। নতুন প্রোগ্রামাররা প্রায়শই মডিউলার কোড লিখতে পারে না, সবকিছু এক জায়গায় লিখে জগাখিচুড়ি পাকিয়ে ফেলে। তাই মডিউলার কোড লেখা বেশ গুরুত্বপূর্ণ।

প্রোগ্রাম তো আগের চেয়ে সুন্দরভাবে লেখা হলো। কিন্তু আমরা আমাদের প্রোগ্রামে কোথাও এক্সেপশন হ্যান্ডেল করি নি। এক্সেপশন হ্যান্ডেল করার বিষয়টি আমি “পাইথন দিয়ে প্রোগ্রামিং শেখা ২য় খণ্ড” বইতে আলোচনা করেছি। এখন কথা হচ্ছে, কোন কোন জায়গায় এক্সেপশন হ্যান্ডেল করা উচিত? আমাদের প্রোগ্রামে আমি তিনটি জায়গা দেখতে পাচ্ছি যেখানে ঝামেলা হতে পারে – 

  • আমরা যখন এপিআই কল করছি, সেখানে যদি ইন্টারনেট কানেকশনে কোনো ঝামেলা হয়, কিংবা সার্ভারে কোনো সমস্যা হয়, তখন আমাদের প্রোগ্রাম ক্র্যাশ করবে।
  • আমরা যখন জেসন (json) ডেটা থেকে তাপমাত্রা ও বাতাসের আর্দ্রতা নিচ্ছি, সেখানে ডিকশনারি ব্যবহার করা হচ্ছে। যদি কি (key) না থাকে, তখন প্রোগ্রাম ক্র্যাশ করতে পারে।
  • এসকিউএল কুয়েরি (যেমন, ডেটা ইনসার্ট) ঠিকভাবে না চললে, তখন এরর দিবে এবং সেটিও কোডে ঠিকঠাক হ্যান্ডেল করতে হবে।

পাইথন দিয়ে এপিআই ব্যবহার – ২য় পর্ব

আগের লেখায় আমরা আবহাওয়ার তথ্য কেবল স্ক্রিনে প্রিন্ট করেছিলাম। এবারে সেটি ডেটাবেজে সংরক্ষণ করার ব্যবস্থা করবো। ডেটাবেজ হিসেবে এসকিউলাইট ব্যবহার করা হবে। ডেটাবেজ নিয়ে যাদের কোনো ধারণা নেই, তারা আমার এসকিউলাইট পরিচিতি ভিডিও সিরিজ দেখে নিলে সুবিধা হবে।

আমরা পাইথন প্রোগ্রাম থেকেই temperature নামে একটি টেবিল তৈরি করবো। এই টেবিলের প্রথম কলাম হবে একটি id নামক একটি ইন্টিজার। এটিকে আমরা প্রাইমারি কি, নট নাল এবং অটো-ইনক্রিমেন্ট হিসেবে উল্লেখ করে দিবো। যারা এই কথাটির অর্থ বুঝতে পারে নাই, তাদের চিন্তার কিছু নাই। এই কথার অর্থ না বুঝলেও লেখাটি পড়তে ও প্রোগ্রাম করতে কোনো সমস্যা হবে না। টেবিলে আমরা তাপমাত্রা ও বাতাসের আর্দ্রতা ছাড়াও তারিখ ও সময় সংরক্ষণ করব। 

পাইথন দিয়ে কিভাবে এসকিউলাইট ব্যবহার করতে হয়, সেটি জানা যাবে এখানে – https://docs.python.org/3/library/sqlite3.html। এখন টেবিল তৈরি করার জন্য আমরা এই কোড ব্যবহার করতে পারি –

import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS temperature (id INTEGER PRIMARY KEY AUTOINCREMENT, temp REAL, humidity REAL, datetime TEXT)''')

আর বর্তমান তারিখ ও সময় বের করার জন্য এরকম কোড লিখব –

import datetime
current_time = datetime.datetime.now()

তাহলে আমার পুরো প্রোগ্রামটি দাঁড়াবে এরকম –

import requests
import json
import sqlite3
import datetime

conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS temperature (id INTEGER PRIMARY KEY AUTOINCREMENT, temp REAL, humidity REAL, datetime TEXT)''')

BASE_URL = "http://api.openweathermap.org/data/2.5/weather"

payload = {"id": "1337179", "APPID": "your api key"}

r = requests.get(BASE_URL, params=payload)
result = r.json()

temperature = result["main"]["temp"]
humidity = result["main"]["humidity"]

current_time = datetime.datetime.now()

c.execute('INSERT INTO temperature (temp, humidity, datetime) VALUES(?, ?, ?)', (temperature, humidity, current_time))

conn.commit()
conn.close()

এখন ওপরের প্রোগ্রামটি রান করলে ডেটাবেজে তাপমাত্রার তথ্য সংরক্ষিত হবে। আমরা টার্মিনাল থেকে বিষয়টি পরীক্ষা করতে পারি। যেই ফোল্ডার বা ডিরেক্টরি থেকে আমরা weather_info.py ফাইলটি রান করেছি, টার্মিনাল থেকে সেখানে গিয়ে আমরা এসকিউলাইট চালু করে তারপর টেবিলের ডেটা দেখতে পারি।

$ sqlite3 example.db
SQLite version 3.24.0 2018-06-04 14:10:15
Enter ".help" for usage hints.
sqlite> select * from temperature;
1|292.18|56.0|2019-07-29 23:35:32.797251

আমার কম্পিউটারে প্রোগ্রামটি ঠিকঠাক রান করেছে এবং ডেটাবেজেও ডেটা সংরক্ষিত হয়েছে। আশা করি, প্রোগ্রামটি লিখতে পেরে অনেকেই আনন্দিত হয়েছে। কিন্তু আমি যদি চাকরির ইন্টারভিউতে কাউকে এই কাজটি করতে দিই, এবং সে এরকম কোড লিখে, তাহলে তাকে আমি ইন্টারভিউতে পাশ করাব না। তাহলে কিরকম কোড লিখতে হবে? আলোচনা করব পরবর্তী পর্বে