Slick হল একটি ফাংশনাল রিলেশনাল মাপিং (Functional Relational Mapping - FRM) লাইব্রেরি যা স্কালায় ব্যবহৃত হয় ডেটাবেসের সাথে যোগাযোগ করার জন্য। এটি SQL কোডের মতো স্টেটিক কোড লেখার চেয়ে ডেটাবেসের সাথে ফাংশনাল প্রোগ্রামিংয়ের মাধ্যমে যোগাযোগ করার সুযোগ প্রদান করে। Slick লাইব্রেরি স্কালার টাইপ সিস্টেম এবং ফাংশনাল প্রোগ্রামিংয়ের শক্তি ব্যবহার করে ডেটাবেস অপারেশনগুলো সহজ এবং নিরাপদ করে তোলে।
Slick লাইব্রেরি ডেটাবেসের সাথে সরাসরি কাজ করার জন্য JDBC অথবা H2, PostgreSQL, MySQL, এবং আরও অনেক ডেটাবেস সাপোর্ট প্রদান করে।
এখানে আমরা দেখব কিভাবে Slick লাইব্রেরি ব্যবহার করে একটি সিম্পল ডেটাবেস অ্যাপ্লিকেশন তৈরি করা যায়।
১. Slick লাইব্রেরি ডিপেন্ডেন্সি যোগ করা
প্রথমে আপনার build.sbt ফাইলে Slick লাইব্রেরির ডিপেন্ডেন্সি যোগ করতে হবে।
name := "SlickExample"
version := "0.1"
scalaVersion := "2.13.6"
libraryDependencies ++= Seq(
"com.typesafe.slick" %% "slick" % "3.3.3", // Slick core library
"com.typesafe.slick" %% "slick-hikaricp" % "3.3.3", // Slick HikariCP for connection pooling
"com.typesafe.slick" %% "slick-testkit" % "3.3.3" // For testing
)এখানে:
slickলাইব্রেরি Slick-এর মূল ফাংশনাল লাইব্রেরি।slick-hikaricpলাইব্রেরি HikariCP পুল ব্যবহার করার জন্য যা কানেকশন পুলিংয়ের জন্য ব্যবহৃত হয়।
২. Slick ব্যবহার করে ডেটাবেস কানেকশন সেটআপ
এখন আমরা একটি ডেটাবেস সংযোগ সেটআপ করব এবং Slick ব্যবহার করে কিছু বেসিক অপারেশন করব।
২.১ ডেটাবেস কানেকশন সেটআপ (PostgreSQL বা H2)
প্রথমে ডেটাবেস কানেকশন পুলিং সেটআপ করতে হবে।
import slick.jdbc.H2Profile.api._ // Use H2 in-memory database for simplicity
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
// Database configuration
val db = Database.forConfig("mydb") // Configuration from application.conf
// Define a simple Table
class Users(tag: Tag) extends Table[(Int, String, String)](tag, "USER") {
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]Database.forConfig("mydb") থেকে ডেটাবেস কানেকশন সেট করা হয়, যেখানে mydb হল application.conf ফাইলে নির্দিষ্ট করা কনফিগারেশন সেকশন।
৩. Slick দিয়ে ডেটাবেস অপারেশন
এখন আমরা কিছু সাধারণ ডেটাবেস অপারেশন (যেমন INSERT, SELECT, UPDATE, DELETE) দেখতে পারি।
৩.১ ডেটাবেসে ইনসার্ট করা (Insert into Database)
val insertAction = users += (1, "John", "Doe")
// Running the insert action
val insertFuture: Future[Int] = db.run(insertAction)
insertFuture.onComplete {
case Success(result) => println(s"Inserted $result row(s)")
case Failure(exception) => println(s"Failed to insert row: ${exception.getMessage}")
}এখানে += অপারেটর দিয়ে একটি নতুন রেকর্ড ইনসার্ট করা হচ্ছে।
৩.২ ডেটাবেস থেকে সিলেক্ট করা (Select from Database)
val query = users.filter(_.firstName === "John").result
val selectFuture: Future[Seq[(Int, String, String)]] = db.run(query)
selectFuture.onComplete {
case Success(result) => println(s"Query result: ${result.mkString(", ")}")
case Failure(exception) => println(s"Query failed: ${exception.getMessage}")
}এখানে filter পদ্ধতি ব্যবহার করে একটি কন্ডিশন দিয়ে রেকর্ড ফিল্টার করা হয়েছে।
৩.৩ ডেটাবেসে আপডেট করা (Update in Database)
val updateAction = users.filter(_.id === 1).map(u => (u.firstName, u.lastName)).update(("John", "Smith"))
val updateFuture: Future[Int] = db.run(updateAction)
updateFuture.onComplete {
case Success(result) => println(s"Updated $result row(s)")
case Failure(exception) => println(s"Update failed: ${exception.getMessage}")
}এখানে map এবং update পদ্ধতি ব্যবহার করে একটি নির্দিষ্ট রেকর্ড আপডেট করা হয়েছে।
৩.৪ ডেটাবেস থেকে ডিলিট করা (Delete from Database)
val deleteAction = users.filter(_.id === 1).delete
val deleteFuture: Future[Int] = db.run(deleteAction)
deleteFuture.onComplete {
case Success(result) => println(s"Deleted $result row(s)")
case Failure(exception) => println(s"Delete failed: ${exception.getMessage}")
}এখানে delete পদ্ধতি ব্যবহার করে একটি রেকর্ড ডিলিট করা হচ্ছে।
৪. ডেটাবেস কনফিগারেশন
application.conf ফাইলে ডেটাবেস কানেকশনের কনফিগারেশন সেট করা হয়।
mydb = {
driver = "slick.jdbc.H2Profile$"
db {
url = "jdbc:h2:mem:test1;DB_CLOSE_DELAY=-1"
driver = "org.h2.Driver"
connectionPool = "HikariCP"
numThreads = 10
keepAliveConnection = true
}
}এখানে H2 ইন-মেমরি ডেটাবেস ব্যবহার করা হয়েছে। আপনি চাইলে PostgreSQL বা MySQL কনফিগারেশনও ব্যবহার করতে পারেন।
৫. Future ব্যবহার
Slick এর কার্যক্রম Future ব্যবহার করে অ্যাসিঙ্ক্রোনাসলি পরিচালিত হয়। একাধিক ডেটাবেস অপারেশনকে db.run() পদ্ধতি ব্যবহার করে চালানো হয়, যা একটি Future রিটার্ন করে।
৬. Slick টেস্টিং
Slick তে টেস্টিং করার জন্য Slick TestKit ব্যবহার করা হয়। এটি ইন-মেমরি ডেটাবেস এবং DBIO অ্যাকশন ব্যবহার করে টেস্টিং করতে সাহায্য করে।
import slick.jdbc.H2Profile.api._
val testDB = Database.forConfig("mydb")
// Define test query
val queryTest = testDB.run(users.result)সারাংশ
- Slick হল একটি ফাংশনাল রিলেশনাল মাপিং (FRM) লাইব্রেরি যা স্কালায় ডেটাবেসের সাথে যোগাযোগ করার জন্য ব্যবহৃত হয়।
- এটি SQL কোডের মতো স্টেটিক কোড লেখার চেয়ে ডেটাবেসের সাথে ফাংশনাল প্রোগ্রামিংয়ের মাধ্যমে যোগাযোগ করার সুবিধা দেয়।
- Slick লাইব্রেরি ব্যবহারের মাধ্যমে ডেটাবেস অপারেশনগুলো অ্যাসিঙ্ক্রোনাসলি পরিচালনা করা যায় এবং কার্যকরভাবে SQL এবং স্কালা কোডের মধ্যে সংযোগ স্থাপন করা যায়।
Read more