Slick/Doobie ile Veritabanı Entegrasyonu
Slick veya Doobie gibi popüler Scala ORM'lerini ve kitaplıklarını kullanarak veritabanlarını Play uygulamanıza entegre etmeyi öğrenin.
Slick/Doobie ile Veritabanı Entegrasyonu, CoddyKit'te ücretsiz bir Scala for Backend Engineering & Functional Programming dersidir. Bu, 3 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Scala for Backend Engineering & Functional Programming öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Scala for Backend Engineering & Functional Programming kursu toplamda 3 dersten oluşur.
Veritabanları Neden Tümleştirilir?
Web uygulamalarının verileri kalıcı olarak depolaması ve alması çoğu zaman gerekir. Bu veriler kullanıcı profilleri, ürün bilgileri veya blog gönderileri olabilir.
- Kalıcılık: Uygulama yeniden başlatıldıktan sonra bile veriler kullanılabilir durumda kalır.
- Ölçeklenebilirlik: Büyük miktarda veriyi ve aynı anda bağlanan çok sayıda kullanıcıyı işleyebilme.
- Güvenilirlik: Veri bütünlüğünü ve kurtarılabilirliğini sağlama.
Play Framework ile oluşturulan tüm dinamik web uygulamaları için bir veritabanı entegre etmek kritik öneme sahiptir.
Slick ve Doobie: Scala'nın Veritabanı Araçları
Scala, veritabanıyla etkileşim için güçlü kütüphaneler sunar; Slick ve Doobie en popüler iki seçenektir.
- Slick: İşlevsel İlişkisel Eşleme (FRM) kütüphanesidir. SQL'i soyutlayarak veritabanlarıyla tür güvenli ve işlevsel bir şekilde çalışmanıza olanak tanır.
- Doobie: Tamamen işlevsel bir JDBC katmanıdır. Cats Effect gibi işlevsel programlama yaklaşımlarıyla bütünleşirken SQL sorguları üzerinde doğrudan denetim sağlar.
Bu derste, daha üst düzey soyutlaması sayesinde Play Framework ile ilk entegrasyonu genellikle kolaylaştıran Slick üzerinde yoğunlaşacağız.
Play'de Slick'i Kurma
Öncelikle build.sbt dosyanıza Slick'i ve bir veritabanı sürücüsünü ekleyin. Kolay kurulum için bellek içi bir veritabanı olan H2'yi kullanacağız.
Ardından veritabanı bağlantınızı conf/application.conf içinde yapılandırın.
import play.sbt.PlayImport._
libraryDependencies ++= Seq(
jdbc,
ws,
"com.typesafe.play" %% "play-slick" % "5.0.0",
"com.typesafe.play" %% "play-slick-evolutions" % "5.0.0",
"com.h2database" % "h2" % "2.2.224"
)Veritabanı Yapılandırması
H2 veritabanını ve Slick profilini kurmak için bu satırları conf/application.conf dosyanıza ekleyin. slick.dbs.default.profile, veritabanı türünü belirtir.
play.db.prototype.slick, veritabanı bağlantıları için bir şablon tanımlar.
slick.dbs.default.profile="slick.jdbc.H2Profile$"
play.db {
prototype.slick = {
db.driver="org.h2.Driver"
db.url="jdbc:h2:mem:play;DB_CLOSE_DELAY=-1"
db.username="sa"
db.password=""
}
# Apply the prototype to our default DB
default = ${play.db.prototype.slick}
}Modelinizi Tanımlama (Slick Tablosu)
Slick'te veritabanı tablolarını slick.jdbc.H2Profile.api.Table sınıfını genişleten Scala sınıfları olarak temsil edersiniz. Her sütun bir Scala türüyle eşlenir.
Sorgulama için giriş noktası olan bir TableQuery değerini her tablo için tanımlarız.
import slick.jdbc.H2Profile.api._
// Define a case class for our data model
case class User(id: Option[Long], name: String, email: String)
// Define the table mapping
class Users(tag: Tag) extends Table[User](tag, "users") {
def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def email = column[String]("email")
// Every table needs a * projection with the default mapping
def * = (id, name, email) <> (User.tupled, User.unapply)
}
// TableQuery for accessing the Users table
val users = TableQuery[Users]Kod: Tablo ve Şema Oluşturma
Bu çalıştırılabilir örnek, bir User tablosunun nasıl tanımlanacağını ve ardından bellek içi bir H2 veritabanında şemasının nasıl oluşturulacağını gösterir. db.run yöntemi veritabanı işlemlerini eşzamansız olarak yürütür.
import slick.jdbc.H2Profile.api._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._
case class User(id: Option[Long], name: String, email: String)
class Users(tag: Tag) extends Table[User](tag, "users") {
def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def email = column[String]("email")
def * = (id, name, email) <> (User.tupled, User.unapply)
}
object SlickDemo {
val users = TableQuery[Users]
def main(args: Array[String]): Unit = {
val db = Database.forURL("jdbc:h2:mem:test1;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")
try {
val setup = DBIO.seq(
users.schema.create
)
val future = db.run(setup)
Await.result(future, 2.seconds)
println("Users table created successfully!")
} finally {
db.close()
}
}
}İşlemler için DAO Kalıbı
Veri Erişim Nesnesi (DAO) kalıbı, veritabanı işlemlerini kapsüllemeye yardımcı olur. Uygulamanızın iş mantığını kalıcılık mantığından ayırır.
Bir UserDAO, User nesnelerini ekleme, sorgulama, güncelleme ve silme yöntemlerini içerebilir.
import slick.jdbc.H2Profile.api._
import scala.concurrent.Future
class UserDAO(db: Database) {
import SlickDemo.users // Assuming users TableQuery is in SlickDemo object
def insert(user: User): Future[User] = {
db.run(users returning users.map(_.id) into ((user, id) => user.copy(id = id)) += user)
}
def findAll(): Future[Seq[User]] = {
db.run(users.result)
}
def findById(id: Long): Future[Option[User]] = {
db.run(users.filter(_.id === id).result.headOption)
}
}Kod: Veri Ekleme ve Sorgulama
Az önce tanımladığımız DAO yöntemlerini kullanarak yeni bir kullanıcının nasıl ekleneceğini ve ardından veritabanındaki tüm kullanıcıların nasıl sorgulanacağını burada görebilirsiniz.
import slick.jdbc.H2Profile.api._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._
case class User(id: Option[Long], name: String, email: String)
class Users(tag: Tag) extends Table[User](tag, "users") {
def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def email = column[String]("email")
def * = (id, name, email) <> (User.tupled, User.unapply)
}
class UserDAO(db: Database) {
val users = TableQuery[Users]
def insert(user: User): Future[User] =
db.run(users returning users.map(_.id) into ((u, id) => u.copy(id = id)) += user)
def findAll(): Future[Seq[User]] =
db.run(users.result)
}
object SlickOperations {
def main(args: Array[String]): Unit = {
val db = Database.forURL("jdbc:h2:mem:test2;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")
val userDAO = new UserDAO(db)
try {
Await.result(db.run(userDAO.users.schema.create), 2.seconds)
println("Table created.")
val future = for {
user1 <- userDAO.insert(User(None, "Alice", "alice@example.com"))
user2 <- userDAO.insert(User(None, "Bob", "bob@example.com"))
allUsers <- userDAO.findAll()
} yield allUsers
val result = Await.result(future, 5.seconds)
println(s"All users: $result")
} finally {
db.close()
}
}
}DAO'yu Play'e Entegre Etme
Bir Play uygulamasında genellikle UserDAO değerini bağımlılık enjeksiyonu kullanarak bir denetleyiciye enjekte edersiniz. Bu sayede denetleyici eylemleriniz veritabanıyla etkileşime girebilir.
Database ve UserDAO örneklerinin sağlanması için Play'in DI yapılandırmasını (örneğin Guice) yapmanız gerekir.
import play.api.mvc._
import play.api.libs.json._
import scala.concurrent.ExecutionContext
import javax.inject._
// Assuming User and UserDAO are defined as before
@Singleton
class UserController @Inject()(cc: ControllerComponents, userDAO: UserDAO)
(implicit ec: ExecutionContext) extends AbstractController(cc) {
def listUsers = Action.async {
userDAO.findAll().map { users =>
Ok(Json.toJson(users))
}
}
def createUser = Action.async(parse.json) {
request =>
request.body.validate[User].map { user =>
userDAO.insert(user).map(u => Created(Json.toJson(u)))
}.getOrElse(Future.successful(BadRequest("Invalid User Data")))
}
}Hızlı Kontrol: Slick Tablosu
Aşağıdaki Scala durum sınıfını ve kısmen tanımlanmış Slick Table eşlemesini inceleyin:
case class Product(id: Option[Int], name: String, price: Double)id, name ve price sütunlarının tanımlandığı varsayılırsa, Product tablosu için * projeksiyonunu hangi satır doğru şekilde tamamlar?
Özet: Veritabanı Entegrasyonu
Bu derste, Slick kullanarak veritabanlarının Play Framework uygulamalarınıza nasıl entegre edileceğini inceledik.
- Slick'in İşlevsel İlişkisel Eşleme (FRM) kütüphanesi olarak rolünü öğrendik.
- Slick bağımlılıklarının kurulmasını ve veritabanının
application.confiçinde yapılandırılmasını ele aldık. - Scala durum sınıflarının nasıl tanımlanacağını ve Slick'in
Tablesınıfı kullanılarak veritabanı tablolarıyla nasıl eşleneceğini gördünüz. - Veritabanı işlemlerini düzenlemek için DAO kalıbını tanıttık ve veri ekleme ve sorgulama örnekleri sunduk.
- Son olarak, bu DAO işlemlerinin web API uç noktaları için Play denetleyicilerine nasıl entegre edileceğine değindik.
Veritabanı entegrasyonunda uzmanlaşmak, sağlam ve veri odaklı Play uygulamaları oluşturmanın anahtarıdır!
Sıkça Sorulan Sorular
“Slick/Doobie ile Veritabanı Entegrasyonu” dersi ücretsiz mi?
Evet — “Slick/Doobie ile Veritabanı Entegrasyonu” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Scala for Backend Engineering & Functional Programming kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Scala for Backend Engineering & Functional Programming kursu toplamda 3 dersten oluşur.
“Slick/Doobie ile Veritabanı Entegrasyonu” dersinde ne öğreneceğim?
Slick veya Doobie gibi popüler Scala ORM'lerini ve kitaplıklarını kullanarak veritabanlarını Play uygulamanıza entegre etmeyi öğrenin. Scala for Backend Engineering & Functional Programming ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Scala for Backend Engineering & Functional Programming öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Scala for Backend Engineering & Functional Programming, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 3. dersidir.
“Slick/Doobie ile Veritabanı Entegrasyonu” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Scala for Backend Engineering & Functional Programming dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Scala for Backend Engineering & Functional Programming dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Play Framework Temelleri
- Play ile RESTful API Oluşturma
- Slick/Doobie ile Veritabanı Entegrasyonu