PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Slick 2.0 Ogólne operacje CRUD

Udało mi się to zrobić, to moja ogólna cecha:

import scala.slick.driver.PostgresDriver
import scala.slick.driver.PostgresDriver.simple._
import path.to.RichTable

trait PostgresGeneric[T <: RichTable[A], A] {

  val tableReference: TableQuery[T]

  def insert(row: T#TableElementType)(implicit s: Session) = 
    tableReference.insert(row)

  def insertAndGetId(row: T#TableElementType)(implicit s: Session) = 
    (tableReference returning tableReference.map(_.id)) += row

  def deleteById(id: Long)(implicit s: Session): Boolean = 
    tableReference.filter(_.id === id).delete == 1

  def updateById(id: Long, row: T#TableElementType)(implicit s: Session): Boolean = 
    tableReference.filter(_.id === id).update(row) == 1

  def selectById(id: Long)(implicit s: Session): Option[T#TableElementType] = 
    tableReference.filter(_.id === id).firstOption

  def existsById(id: Long)(implicit s: Session): Boolean = {
    (for {
      row <- tableReference
      if row.id === id
    } yield row).firstOption.isDefined
  }
}

Gdzie RichTable jest klasą abstrakcyjną z polem identyfikatora, to z ograniczeniem górnej granicy jest przydatne do uzyskania pola identyfikatora T#TableElementType (zobacz to, aby uzyskać więcej informacji):

import scala.slick.driver.PostgresDriver.simple._
import scala.slick.jdbc.{GetResult => GR}

abstract class RichTable[T](tag: Tag, name: String) extends Table[T](tag, name) {
  val id: Column[Long] = column[Long]("id", O.PrimaryKey, O.AutoInc)
}

A moja tabela kampanii wygląda teraz tak:

import scala.slick.driver.PostgresDriver.simple._
import scala.slick.jdbc.{GetResult => GR}
import scala.slick.lifted.TableQuery

case class CampaignRow(id: Long, name: Option[String])

class Campaign(tag: Tag) extends RichTable[CampaignRow](tag, "campaign") {
  def * = (id, name) <>(CampaignRow.tupled, CampaignRow.unapply)

  def ? = (id.?, name).shaped.<>({
    r => import r._; _1.map(_ => CampaignRow.tupled((_1.get, _2)))
  }, (_: Any) => throw new Exception("Inserting into ? projection not supported."))

  override val id: Column[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey)
  val name: Column[Option[String]] = column[Option[String]]("name")
}

Model implementujący cechę ogólną wygląda tak:

 object CampaignModel extends PostgresGeneric[Campaign, CampaignRow] {

   override val tableReference: PostgresDriver.simple.TableQuery[Tables.Campaign] = 
     TableQuery[Campaign]

   def insertCampaign(row: CampaignRow) = {
     insert(CampaignRow(0, "test"))
   }
 }



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawdzić, czy tablica PostgreSQL zawiera wartość?

  2. Postgres SELECT gdzie WHERE jest UUID lub ciągiem

  3. 3 sposoby na wyświetlenie listy wszystkich procedur składowanych, które odwołują się do tabeli w PostgreSQL

  4. Znajdź nazwę hosta i port za pomocą poleceń PSQL

  5. Odpowiednik PostgreSQL dla TOP n WITH TIES:LIMIT z powiązaniami?