sql >> データベース >  >> RDS >> PostgreSQL

Slick2.0の一般的なCRUD操作

    私はなんとかそれを機能させることができました、これは私の一般的な特徴です:

    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
      }
    }
    

    RichTableの場所 はidフィールドを持つ抽象クラスです。これは、上限制約があり、T#TableElementTypeのidフィールドを取得するのに役立ちます。 (詳細については、こちらをご覧ください):

    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)
    }
    

    そして、私のキャンペーンテーブルは次のようになります:

    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")
    }
    

    一般的な特性を実装するモデルは次のようになります:

     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. 指定された名前と引数のタイプに一致する演算子はありません。明示的な型キャストを追加する必要があるかもしれません。 --Netbeans、Postgresql 8.4、Glassfish

    2. Oracleで全表スキャンを検索するためのクエリ

    3. Pl/pgsql関数のCOPYステートメントを使用して診断を取得する

    4. SQL Server 2016:データベースを作成する