Scala,Slick:如何使用自动生成的数字和字节数组来插入

时间:2015-05-21 17:27:41

标签: scala slick

object FingerprintsModel extends FingerprintDAO {
    // Fingerprint class definition
  class FingerprintsTable(tag: Tag) extends Table[Fingerprint](tag, "fingerprints") {
      def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
      def customerId = column[String]("customer_id", O.NotNull)
      def template_one = column[Array[Byte]]("template_one", O.NotNull)
      def template_two = column[Array[Byte]]("template_two", O.NotNull)
      def created = column[DateTime]("created", O.NotNull)
      def updated = column[Option[DateTime]]("updated")

      def * = (id, customerId, template_one, template_two) <> (Fingerprint.tupled, Fingerprint.unapply _)
      def fingerprint = foreignKey("CUSTOMER", customerId, CustomersModel.customers)(_.id)
  }

这是我的插入声明:

FingerprintsModel.fingerprints.map(fi => (fi.customerId, fi.template_one, fi.template_two, fi.created))
                .insert((id, fingerprint.template_one, fingerprint.template_two, new DateTime()))

1 个答案:

答案 0 :(得分:0)

<强>摘要

您需要进行两项主要修改:

  1. 您需要TableQuery[FingerprintsTable]致电insert(或+=++=);和
  2. 要获取插入的ID,您需要在Slick中使用returning方法。
  3. 工作示例

    很难从您发布的代码中确切地说出您的想法。下次首先简化您的示例将会很有帮助。

    我认为你的模型是这样的:

      case class Fingerprint(
        id: Long,
        customerId: String,
        template_one: Array[Byte]
      )
    

    我遗漏了其中一个字节数组以及创建和更新的字段,因为它们似乎与问题无关。换句话说,我已经简化了。

    FingerprintTable似乎没问题。我忽略了外键,因为它看起来并不相关。哦,O.NotNull现已弃用(至少在Slick 3中)。您可以将其关闭,因为您的列不是Option值。

    我们需要的是表格查询,我在FingerprintsModel内添加:

      lazy val fingerprints = TableQuery[FingerprintsTable]
      lazy val fingerprintsWithID = fingerprints returning fingerprints.map(_.id)
    

    您可以使用fingerprints插入数据。但是您已经回复了ID,因此您想使用fingerprintsWithID

    全部放在一起(再次,在这里使用Slick 3):

    object FingerprintExample extends App {
    
      import FingerprintsModel._
    
      val testData = Seq(
        Fingerprint(0L, "Alice", Array(0x01, 0x02)),
        Fingerprint(0L, "Bob",   Array(0x03, 0x04))
      )
    
      // A program that will create the schema, and insert the data, returning the IDs
      val program = for {
        _   <- fingerprints.schema.create
        ids <- fingerprintsWithID ++= testData
      } yield ids
    
      // Run the program using an in-memory database
      val db = Database.forConfig("h2mem1")
      val future = db.run(program)
      val result = Await.result(future, 10 seconds)
      println(s"The result is: $result")
    }
    

    制作:

       The result is: List(1, 2)