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。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |