Skip to content

rtkaczyk/inslick

Repository files navigation

InSlick

CircleCI Maven Central

InSlick is a macro extension to Slick used with plain SQL queries. It can expand collections into a sequence of arguments to SQL IN operator.

Problem

Let's say you receive a list of customer names from user input and you want to retrieve full records of customers identified by those names. The SQL query might look like:

SELECT * FROM customer WHERE (first_name, last_name) IN (row('John', 'Kowalski'), row('Jane', 'Smith'))

You might be tempted to construct a String from your collection and splice it with # like so:

val names = List(("John", "Kowalski"), ("Jane", "Smith"))
val namesStr = names.map { case (fn, ln) => s"row('$fn', '$ln')"}.mkString("(", ", ", ")")
val query = sql"SELECT * FROM customer WHERE (first_name, last_name) IN #$namesStr"

However, this is not safe from SQL injection!

Solution

Add InSlick to your project:

libraryDependencies += "io.github.rtkaczyk" %% "inslick" % "1.1.0"

and use the sqli interpolator:

import accode.inslick.syntax._

val names = List(("John", "Kowalski"), ("Jane", "Smith"))
val query = sqli"SELECT * FROM customer WHERE (first_name, last_name) IN *$names"

User Guide

For the list of supported databases and more usage examples see the User Guide.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages