How can I connect to a postgreSQL database in scala? How can I connect to a postgreSQL database in scala? postgresql postgresql

How can I connect to a postgreSQL database in scala?


You need to add dependency "org.postgresql" % "postgresql" % "9.3-1102-jdbc41" in build.sbt and you can modify following code to connect and query database. Replace DB_USER with your db user and DB_NAME as your db name.

import java.sql.{Connection, DriverManager, ResultSet}object pgconn extends App {  println("Postgres connector")  classOf[org.postgresql.Driver]  val con_st = "jdbc:postgresql://localhost:5432/DB_NAME?user=DB_USER"  val conn = DriverManager.getConnection(con_str)  try {    val stm = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)    val rs = stm.executeQuery("SELECT * from Users")    while(rs.next) {      println(rs.getString("quote"))    } } finally {     conn.close()  }}


I would recommend having a look at Doobie.

This chapter in the "Book of Doobie" gives a good sense of what your code will look like if you make use of this library.

This is the library of choice right now to solve this problem if you are interested in the pure FP side of Scala, i.e. scalaz, scalaz-stream (probably fs2 and cats soon) and referential transparency in general.

It's worth nothing that Doobie is NOT an ORM. At its core, it's simply a nicer, higher-level API over JDBC.


Take look at the tutorial "Using Scala with JDBC to connect to MySQL", replace the db url and add the right jdbc library. The link got broken so here's the content of the blog:

Using Scala with JDBC to connect to MySQL

A howto on connecting Scala to a MySQL database using JDBC. There are a number of database libraries for Scala, but I ran into a problem getting most of them to work. I attempted to use scala.dbc, scala.dbc2, Scala Query and Querulous but either they aren’t supported, have a very limited featured set or abstracts SQL to a weird pseudo language.

The Play Framework has a new database library called ANorm which tries to keep the interface to basic SQL but with a slight improved scala interface. The jury is still out for me, only used on one project minimally so far. Also, I’ve only seen it work within a Play app, does not look like it can be extracted out too easily.

So I ended up going with basic Java JDBC connection and it turns out to be a fairly easy solution.

Here is the code for accessing a database using Scala and JDBC. You need to change the connection string parameters and modify the query for your database. This example was geared towards MySQL, but any Java JDBC driver should work the same with Scala.

Basic Query

import java.sql.{Connection, DriverManager, ResultSet};// Change to Your Database Configval conn_str = "jdbc:mysql://localhost:3306/DBNAME?user=DBUSER&password=DBPWD"// Load the driverclassOf[com.mysql.jdbc.Driver]// Setup the connectionval conn = DriverManager.getConnection(conn_str)try {    // Configure to be Read Only    val statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)    // Execute Query    val rs = statement.executeQuery("SELECT quote FROM quotes LIMIT 5")    // Iterate Over ResultSet    while (rs.next) {        println(rs.getString("quote"))    }}finally {    conn.close}

You will need to download the mysql-connector jar.

Or if you are using maven, the pom snippets to load the mysql connector, you’ll need to check what the latest version is.

<dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>  <version>5.1.12</version></dependency>

To run the example, save the following to a file (query_test.scala) and run using, the following specifying the classpath to the connector jar:

scala -cp mysql-connector-java-5.1.12.jar:. query_test.scala

Insert, Update and Delete

To perform an insert, update or delete you need to create an updatable statement object. The execute command is slightly different and you will most likely want to use some sort of parameters. Here’s an example doing an insert using jdbc and scala with parameters.

// create database connectionval dbc = "jdbc:mysql://localhost:3306/DBNAME?user=DBUSER&password=DBPWD"classOf[com.mysql.jdbc.Driver]val conn = DriverManager.getConnection(dbc)val statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE)// do database inserttry {  val prep = conn.prepareStatement("INSERT INTO quotes (quote, author) VALUES (?, ?) ")  prep.setString(1, "Nothing great was ever achieved without enthusiasm.")  prep.setString(2, "Ralph Waldo Emerson")  prep.executeUpdate}finally {  conn.close}