• Stars
    star
    140
  • Rank 252,006 (Top 6 %)
  • Language
    Scala
  • Created 7 months ago
  • Updated 15 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Query SQL databases from Scala via concise, type-safe, and familiar case classes and collection operations. Supports Postgres, MySql, H2, and Sqlite out of the box

ScalaSql

ScalaSql is a Scala library that allows type-safe low-boilerplate querying of SQL databases, using "standard" Scala collections operations running against typed Table descriptions.

import scalasql._, SqliteDialect._

// Define your table model classes
case class City[T[_]](
    id: T[Int],
    name: T[String],
    countryCode: T[String],
    district: T[String],
    population: T[Long]
)
object City extends Table[City]

// Connect to your database (example uses in-memory sqlite, org.xerial:sqlite-jdbc:3.43.0.0)
val dataSource = new org.sqlite.SQLiteDataSource()
dataSource.setUrl(s"jdbc:sqlite:file.db")
lazy val dbClient = new scalasql.DbClient.DataSource(
  dataSource,
  config = new scalasql.Config {
    override def nameMapper(v: String) = v.toLowerCase() // Override default snake_case mapper
    override def logSql(sql: String, file: String, line: Int) = println(s"$file:$line $sql")
  }
)

dbClient.transaction{ db =>

  // Initialize database table schema and data
  db.updateRaw(os.read(os.Path("scalasql/test/resources/world-schema.sql", os.pwd)))
  db.updateRaw(os.read(os.Path("scalasql/test/resources/world-data.sql", os.pwd)))

  // Adding up population of all cities in China
  val citiesPop = db.run(City.select.filter(_.countryCode === "CHN").map(_.population).sum)
  // SELECT SUM(city0.population) AS res FROM city city0 WHERE city0.countrycode = ?
  println(citiesPop)
  // 175953614

  // Finding the 5-8th largest cities by population
  val fewLargestCities = db.run(
    City.select
        .sortBy(_.population).desc
        .drop(5).take(3)
        .map(c => (c.name, c.population))
  )
  // SELECT city0.name AS res__0, city0.population AS res__1
  // FROM city city0 ORDER BY res__1 DESC LIMIT ? OFFSET ?
  println(fewLargestCities)
  // Seq((Karachi, 9269265), (Istanbul, 8787958), (Ciudad de MΓ©xico, 8591309))
}

ScalaSql supports PostgreSQL, MySQL, Sqlite, and H2 databases. Support for additional databases can be easily added.

ScalaSql is a relatively new library, so please try it out, but be aware you may hit bugs or missing features! Please open Discussions for any questions, file Issues for any bugs you hit, or send Pull Requests if you are able to investigate and fix them!

Getting Started

To get started with ScalaSql, add it to your build.sc file as follows:

ivy"com.lihaoyi::scalasql:0.1.0"

Documentation

  • ScalaSql Quickstart Examples: self-contained files showing how to set up ScalaSql with a variety of supported databases and perform simple DDL and SELECT/INSERT/UPDATE/DELETE operations:

  • ScalaSql Tutorial: a structured walkthrough of how to use ScalaSql, connecting to a database and writing queries to SELECT/INSERT/UPDATE/DELETE against it to perform useful work. Ideal for newcomers to work through from top to bottom when getting started with the library.

  • ScalaSql Cheat Sheet: a compact summary of the main features of ScalaSql and the syntax to make use of them.

  • ScalaSql Reference: a detailed listing of ScalaSql functionality, comprehensively covering everything that ScalaSql supports, in a single easily searchable place. Ideal for looking up exactly methods/operators ScalaSql supports, looking up how ScalaSql code translates to SQL, or looking up SQL syntax to find out how to express it using ScalaSql. Useful subsections include:

  • ScalaSql Design: discusses the design of the ScalaSql library, why it is built the way it is, what tradeoffs it makes, and how it compares to other common Scala database query libraries. Ideal for contributors who want to understand the structure of the ScalaSql codebase, or for advanced users who may need to understand enough to extend ScalaSql with custom functionality.

  • Developer Docs: things you should read if you want to make changes to the com-lihaoyi/scalasql codebase

Changelog

0.1.0

  • First release!

TODO

  • Scala 3 support
  • JSON columns
  • Add datetime functions
  • Make implicit ctx => for defining sql"..." snippets optional

More Repositories

1

Ammonite

Scala Scripting
Scala
2,579
star
2

mill

Your shiny new Java/Scala build tool!
Scala
1,953
star
3

fastparse

Writing Fast Parsers Fast in Scala
Scala
1,072
star
4

scalatags

ScalaTags is a small XML/HTML construction library for Scala.
Scala
731
star
5

requests-scala

A Scala port of the popular Python Requests HTTP client: flexible, intuitive, and straightforward to use.
Scala
694
star
6

upickle

uPickle: a simple, fast, dependency-free JSON & Binary (MessagePack) serialization library for Scala
Scala
691
star
7

os-lib

OS-Lib is a simple, flexible, high-performance Scala interface to common OS filesystem and subprocess APIs
Scala
636
star
8

sourcecode

Scala library providing "source" metadata to your program, similar to Python's __name__, C++'s __LINE__ or Ruby's __FILE__.
Scala
505
star
9

cask

Cask: a Scala HTTP micro-framework
Scala
494
star
10

utest

A simple testing framework for Scala
Scala
481
star
11

acyclic

Acyclic is a Scala compiler plugin to let you prohibit circular dependencies between files
Scala
247
star
12

fansi

Scala/Scala.js library for manipulating Fancy Ansi colored strings
Scala
224
star
13

PPrint

Pretty-printing value, types and type-signatures in Scala
Scala
217
star
14

mainargs

A small, convenient, dependency-free library for command-line argument parsing in Scala
Scala
173
star
15

castor

Castor is a lightweight, typed Actor library for Scala and Scala.js
Scala
127
star
16

geny

Provides the geny.Generator data type, the dual to a scala.Iterator that can ensure resource cleanup
Scala
88
star
17

unroll

Scala
18
star
18

mill-scala-hello.g8

Giter8 template for a Mill project with a Scala Hello App
Shell
10
star
19

mill-moduledefs

Scalac compiler plugin to support Mill modules
Scala
6
star