加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 使用PostgreSQL和Slick自动增量字段

发布时间:2020-12-16 09:39:35 所属栏目:安全 来源:网络整理
导读:如何使用带有Slick映射表的AutoInc键将记录插入到PostgreSQL中?如果我使用我的case类中的id和Option,并将其设置为None,那么PostgreSQL将在insert上抱怨该字段不能为null。这适用于H2,但不适用于PostgreSQL: //import scala.slick.driver.H2Driver.simpl
如何使用带有Slick映射表的AutoInc键将记录插入到PostgreSQL中?如果我使用我的case类中的id和Option,并将其设置为None,那么PostgreSQL将在insert上抱怨该字段不能为null。这适用于H2,但不适用于PostgreSQL:

//import scala.slick.driver.H2Driver.simple._
//import scala.slick.driver.BasicProfile.SimpleQL.Table
import scala.slick.driver.PostgresDriver.simple._
import Database.threadLocalSession

object TestMappedTable extends App{

    case class User(id: Option[Int],first: String,last: String)

    object Users extends Table[User]("users") {
        def id = column[Int]("id",O.PrimaryKey,O.AutoInc)
        def first = column[String]("first")
        def last = column[String]("last")
        def * = id.? ~ first ~ last <> (User,User.unapply _)
        def ins1 = first ~ last returning id
        val findByID = createFinderBy(_.id)
        def autoInc = id.? ~ first ~ last <> (User,User.unapply _) returning id
    }

 // implicit val session = Database.forURL("jdbc:h2:mem:test1",driver = "org.h2.Driver").createSession()
    implicit val session = Database.forURL("jdbc:postgresql:test:slicktest",driver="org.postgresql.Driver",user="postgres",password="xxx")

  session.withTransaction{
    Users.ddl.create

    // insert data
    print(Users.insert(User(None,"Jack","Green" )))
    print(Users.insert(User(None,"Joe","Blue" )))
    print(Users.insert(User(None,"John","Purple" )))
    val u = Users.insert(User(None,"Jim","Yellow" ))
  //  println(u.id.get)
    print(Users.autoInc.insert(User(None,"Johnathan","Seagul" )))
  }
  session.withTransaction{
    val queryUsers = for {
    user <- Users
  } yield (user.id,user.first)
  println(queryUsers.list)

  Users.where(_.id between(1,2)).foreach(println)
  println("ID 3 -> " + Users.findByID.first(3))
  }
}

使用上述与H2成功,但如果我注释掉并改为PostgreSQL,那么我得到:

[error] (run-main) org.postgresql.util.PSQLException: ERROR: null value in column "id" violates not-null constraint
org.postgresql.util.PSQLException: ERROR: null value in column "id" violates not-null constraint

解决方法

这是在这里工作:

object Application extends Table[(Long,String)]("application") {   
    def idlApplication = column[Long]("idlapplication",O.AutoInc)
    def appName = column[String]("appname")
    def * = idlApplication ~ appName
    def autoInc = appName returning idlApplication
}

var id = Application.autoInc.insert("App1")

这是我的SQL的样子:

CREATE TABLE application
(idlapplication BIGSERIAL PRIMARY KEY,appName VARCHAR(500));

更新:

具有User(如问题)的映射表的具体问题可以解决如下:

def forInsert = first ~ last <>
    ({ (f,l) => User(None,f,l) },{ u:User => Some((u.first,u.last)) })

这是从test cases in the Slick git repository。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读