【问题标题】:Slick 3.0 bulk insert returning object's orderSlick 3.0 批量插入返回对象的顺序
【发布时间】:2015-12-11 19:19:29
【问题描述】:

我想使用 Slick 3.0 ++= 函数进行批量插入,并使用返回来返回插入的对象。

我想知道返回对象 (Future[Seq[Something]]) 是否与我的参数 Seq[Something] 具有相同的顺序(没有 id)。

更具体地说,

val personList: Seq[Person] = Seq(Person("name1"), Person("name2"), Person("name3"))
persons returning persons ++= personList

结果肯定是Future(Seq(Person(1, "name1"), Person(2, "name2"), Person(3, "name3")))?或者可以是其他结果顺序?

谢谢。

【问题讨论】:

    标签: scala jdbc slick


    【解决方案1】:

    是的,我相信您正在使用自动递增的主键。 我也和你提到的一样:

     case class Person(name: String, id: Option[Int] = None)
    
     class PersonTable(tag: Tag) extends Table[Person](tag, "person") {
        val id = column[Int]("id", O.PrimaryKey, O.AutoInc)
        val name = column[String]("name")
         def * = (name, id.?) <> (Person.tupled, Person.unapply)
      }
    
     val personTableQuery = TableQuery[PersonTable]
    
     def personTableAutoIncWithObject = 
         (personTableQuery returning personTableQuery.map(_.id)).into((person, id) => person.copy(id = Some(id)))
    
      // insert all person without id  and return all person with their id.
     def insertAll(persons: List[Person]): Future[Seq[Person]] =
       db.run { personTableAutoIncWithObject ++= persons }
    
    
    //unit test for insertion order:
     test("Add new persons ") {
       val response = insertAll(List(Person("A1"), Person("A2"),   Person("A3"), Person("A4"), Person("A5")))
        whenReady(response) { persons =>
            assert(persons === List(Person("A1", Some(1)), Person("A2",    Some(2)), Person("A3", Some(3)),
        Person("A4", Some(4)), Person("A5", Some(5))))
      }
     }       
    

    【讨论】:

    • 请注意,这仅在相关数据库支持时才有效。例如,MySQL 不支持在批量插入时返回 ID。
    【解决方案2】:

    据我所知,批量插入的结果与您发送到数据库的顺序相同,“++=”函数将返回插入到表中的记录数。

    【讨论】:

    • 如果代码是 people 返回 person 将返回插入的记录而不是结果的计数。我只想知道如果我返回插入的记录,顺序是否与参数相同?
    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多