স্কালা ডেটাবেস স্কিমা এবং ORM (Object Relational Mapping) ব্যবহারের মাধ্যমে, আপনি ডেটাবেসের টেবিলগুলির সাথে কোডকে সংযুক্ত করতে পারেন এবং ডেটাবেস অপারেশন যেমন CRUD (Create, Read, Update, Delete) সহজে পরিচালনা করতে পারেন। স্কালার জন্য বেশ কিছু শক্তিশালী ORM লাইব্রেরি এবং ফ্রেমওয়ার্ক রয়েছে, যেমন Slick এবং Doobie, যা ডেটাবেস ম্যানিপুলেশনকে আরও কার্যকরী এবং সুসংগঠিত করে তোলে।
এই লেখায় আমরা স্কালার ডেটাবেস স্কিমা এবং ORM সম্পর্কে বিস্তারিত জানবো, এবং কীভাবে সেগুলি ব্যবহার করতে হয় তা উদাহরণসহ ব্যাখ্যা করা হবে।
১. স্কালা ডেটাবেস স্কিমা (Database Schema)
ডেটাবেস স্কিমা হল ডেটাবেসের কাঠামো বা ডিজাইন, যা টেবিল এবং টেবিলের মধ্যে সম্পর্ক বর্ণনা করে। স্কালা ডেটাবেস স্কিমা তৈরি করতে, সাধারণত ORM ফ্রেমওয়ার্ক ব্যবহার করা হয়, যা স্কিমার ডিজাইন এবং ডেটাবেস ম্যানিপুলেশন সহজ করে তোলে।
২. স্কালা ORM ফ্রেমওয়ার্ক: Slick
Slick হল স্কালার জন্য একটি জনপ্রিয় ORM লাইব্রেরি, যা Functional Relational Mapping (FRM) ধারণায় কাজ করে এবং ডেটাবেসের সাথে সম্পর্কিত কার্যকলাপ সহজ এবং কার্যকরী করে তোলে। Slick কোডের মধ্যে SQL ক্যোয়ারি লেখার জন্য Scala DSL প্রদান করে, যার মাধ্যমে আপনি প্রোগ্রামিং ভাষাতেই ডেটাবেসের টেবিল এবং রিলেশন ডিফাইন করতে পারবেন।
Slick সেটআপ এবং কনফিগারেশন
Slick ডিপেন্ডেন্সি যোগ করা:
আপনার
build.sbtফাইলে Slick লাইব্রেরি এবং ডেটাবেস কনেকশন পুলের জন্য ডিপেন্ডেন্সি যোগ করুন:libraryDependencies ++= Seq( "com.typesafe.slick" %% "slick" % "3.3.3", "com.typesafe.slick" %% "slick-hikari" % "3.3.3", // Connection pool "com.h2database" % "h2" % "1.4.200" // H2 Database for example (can replace with another DB) )Slick স্কিমা এবং টেবিল ডিফাইন করা:
Slick-এ ডেটাবেস স্কিমা তৈরি করতে, আপনি
Tableট্রেইটটি ব্যবহার করেন যা টেবিলের জন্য একটি মডেল হিসেবে কাজ করে।উদাহরণ:
import slick.jdbc.H2Profile.api._ // টেবিল ডিফাইন করা class Users(tag: Tag) extends Table[(Int, String, String)](tag, "USERS") { def id = column[Int]("ID", O.PrimaryKey) def firstName = column[String]("FIRST_NAME") def lastName = column[String]("LAST_NAME") def * = (id, firstName, lastName) } val users = TableQuery[Users]এখানে:
Usersক্লাসটি একটি টেবিল মডেল, যেখানেid,firstName, এবংlastNameহল টেবিলের কলাম।TableQuery[Users]হল টেবিলের জন্য একটি কুয়েরি যা ডেটাবেসের সাথে যোগাযোগ করবে।
ডেটাবেস কনফিগারেশন এবং চালানো:
Slick-এর মাধ্যমে ডেটাবেসের সাথে কাজ করতে, আপনি
Databaseঅবজেক্ট ব্যবহার করে ডেটাবেস কনফিগারেশন এবং কননেকশন সেটআপ করেন।val db = Database.forConfig("h2mem1") // H2 database config in application.confডেটাবেস অপারেশন (CRUD):
স্লিক ব্যবহার করে ডেটাবেসের কার্যকরী অপারেশন যেমন CRUD করতে পারেন। এখানে একটি উদাহরণ:
val setup = DBIO.seq( // Create table users.schema.create, // Insert some data users += (1, "John", "Doe"), users += (2, "Jane", "Doe") ) val result = db.run(setup) result.onComplete { case Success(_) => println("Database setup complete") case Failure(ex) => println(s"Database setup failed: ${ex.getMessage}") }এখানে:
users.schema.create: টেবিল তৈরি করছে।users += (1, "John", "Doe"): ডেটাবেসে নতুন রেকর্ড ইনসার্ট করা হচ্ছে।
৩. Slick-এ কুয়েরি এবং ডেটা রিট্রিভাল
Slick-এ কুয়েরি করতে, আপনি filter, map, sortBy ইত্যাদি ফাংশন ব্যবহার করতে পারেন।
উদাহরণ: ডেটা রিট্রিভাল
val query = users.filter(_.firstName === "John").result
val result = db.run(query)
result.onComplete {
case Success(usersList) =>
usersList.foreach(println)
case Failure(ex) =>
println(s"Query failed: ${ex.getMessage}")
}এখানে:
filter(_.firstName === "John"): স্কিমার মধ্যেfirstNameকলাম থেকেJohnনামের ব্যবহারকারী খুঁজে বের করছে।result: এটি একটি কুয়েরি রেজাল্ট যা প্রাপ্ত ডেটার একটি ফিউচার হিসেবে রিটার্ন করবে।
৪. টাইপ সেফটি এবং টেবিল রিলেশন
Slick টাইপ সেফটি (Type Safety) বজায় রাখে, অর্থাৎ আপনি যখন কুয়েরি লিখবেন তখন এটি টাইপ চেকিং করবে এবং কম্পাইল টাইমে ত্রুটি ধরতে সহায়তা করবে।
উদাহরণ: রিলেশনাল টেবিল
ধরা যাক আমাদের দুটি টেবিল Users এবং Orders রয়েছে, এবং আমরা তাদের মধ্যে একটি সম্পর্ক তৈরি করতে চাই।
class Orders(tag: Tag) extends Table[(Int, Int, Double)](tag, "ORDERS") {
def id = column[Int]("ID", O.PrimaryKey)
def userId = column[Int]("USER_ID")
def amount = column[Double]("AMOUNT")
def user = foreignKey("user_fk", userId, users)(_.id)
def * = (id, userId, amount)
}এখানে:
foreignKey("user_fk", userId, users)(_.id): এটিOrdersটেবিলেরuserIdকলামকেUsersটেবিলেরidকলামের সাথে যুক্ত করে।
৫. Slick এবং টাইপ ক্লাস
Slick-এ টাইপ ক্লাসের মতো কনসেপ্ট ব্যবহার করা যায়, যেখানে আপনি এক্সটেনশন মেথড ব্যবহার করে কাস্টম কোড তৈরি করতে পারেন।
import slick.jdbc.MySQLProfile.api._
import slick.lifted.{TableQuery, Tag}
trait CustomTypes {
implicit val userStatusColumnType = MappedColumnType.base[UserStatus, String](
status => status.toString,
status => UserStatus.withName(status)
)
}এখানে:
MappedColumnType.baseএকটি কাস্টম টাইপ মেপিং তৈরি করছে, যাতেUserStatusটাইপকেString-এ রূপান্তরিত করা যাবে।
সারাংশ
- Slick একটি শক্তিশালী ORM লাইব্রেরি যা স্কালায় ডেটাবেস স্কিমা তৈরি এবং ডেটাবেসের সাথে সহজভাবে যোগাযোগ করতে সাহায্য করে। এটি SQL অপারেশনগুলোকে ফাংশনাল স্টাইল দিয়ে মোকাবেলা করে।
- Akka HTTP এর মাধ্যমে আপনি একটি reactive HTTP সার্ভার এবং ক্লায়েন্ট তৈরি করতে পারেন, যা রিয়েল-টাইম ডেটা প্রসেসিংয়ের জন্য উপযোগী।
- Slick ও Akka HTTP একত্রে ব্যবহার করে আপনি ডেটাবেস এবং HTTP কমিউনিকেশন ইন্টারঅ্যাক্টিভভাবে পরিচালনা করতে পারেন।
Read more