Skip to content

Instantly share code, notes, and snippets.

@gakuzzzz
Last active August 15, 2019 01:23
Show Gist options
  • Save gakuzzzz/526e5b2662a228857e4eb2e30ec22f8c to your computer and use it in GitHub Desktop.
Save gakuzzzz/526e5b2662a228857e4eb2e30ec22f8c to your computer and use it in GitHub Desktop.
ScalikeJDBC の Batch API に ParameterBinderFactory をかますためのヘルパー的なやつ

利用シーン

val emps: Seq[Emp] = ...
val column = Emp.column
val (placeholders, batchParams) = createBatchParams {
  emps.map { emp =>
    Seq(
      column.id   -> emp.id,
      column.name -> emp.name
    )
  }
}
DB localTx { implicit session =>
  withSQL {
    insert.into(Emp).namedValues(placeholders: _*)
  }.batch(batchParams: _*).apply()
}

定義

// もっと適切な名前があれば
def createBatchParams(parameters: Seq[Seq[(SQLSyntax, ParameterBinder)]]):
      (Seq[(SQLSyntax, ParameterBinder)], Seq[Seq[ParameterBinder]]) = {

  def addPlaceholders(columns: Seq[SQLSyntax]): Seq[(SQLSyntax, ParameterBinder)] = {
    columns.zip(List.fill(columns.size)(SQLSyntaxParameterBinder(sqls.?)))
  }

  parameters.foldLeft((Vector.empty[(SQLSyntax, ParameterBinder)], Vector.empty[Seq[ParameterBinder]])) {
    case ((Vector(), paramsSeq), entry)     =>
      val (columns, params) = entry.unzip
      val placeholders = addPlaceholders(columns)
      (placeholders, paramsSeq :+ params)
    case ((placeholders, paramsSeq), entry) =>
      val (_, params) = entry.unzip
      (placeholders, paramsSeq :+ params)
  }

}
@gakuzzzz
Copy link
Author

❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment