如何在scala中连接到postgreSQL数据库?

时间:2010-07-07 12:22:00

标签: postgresql scala

我想知道如何在scala中执行以下操作?

  1. 连接到postgreSQL数据库。
  2. 编写SELECT,UPDATE等SQL查询来修改该数据库中的表。
  3. 我知道在python中我可以使用PygreSQL来做但是如何在scala中做这些事情?

7 个答案:

答案 0 :(得分:14)

我建议您查看Doobie

“Book of Doobie”中的

This章节可以很好地了解如果您使用此库,您的代码将会是什么样子。

如果您对Scala的纯FP方面感兴趣,即scalazscalaz-stream(可能fs2和{{1>,这是现在选择的库来解决此问题很快)和参考透明度一般。

Doobie不是一个ORM是没有价值的。从本质上讲,它只是一个比JDBC更好,更高级的API。

答案 1 :(得分:13)

查看教程"Using Scala with JDBC to connect to MySQL",替换db url并添加正确的jdbc库。链接破了,所以这里是博客的内容:

使用Scala和JDBC连接MySQL

使用JDBC将Scala连接到MySQL数据库的方法。 Scala有许多数据库库,但我遇到了一个问题,让大部分数据库都可以运行。我尝试使用scala.dbc,scala.dbc2,Scala Query和Querulous,但它们不受支持,功能非常有限,或者将SQL抽象为奇怪的伪语言。

Play Framework有一个名为ANorm的新数据库,它试图将接口保持为基本SQL,但稍微改进了scala接口。陪审团对我来说仍然没有,到目前为止只用于一个项目。另外,我只看到它在Play应用程序中运行,看起来不太容易被提取出来。

所以我最终使用基本的Java JDBC连接,结果证明这是一个相当简单的解决方案。

以下是使用Scala和JDBC访问数据库的代码。您需要更改连接字符串参数并修改数据库的查询。这个例子适用于MySQL,但任何Java JDBC驱动程序都应该与Scala一样。

基本查询

import java.sql.{Connection, DriverManager, ResultSet};

// Change to Your Database Config
val conn_str = "jdbc:mysql://localhost:3306/DBNAME?user=DBUSER&password=DBPWD"

// Load the driver
classOf[com.mysql.jdbc.Driver]

// Setup the connection
val 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
}

您需要下载mysql-connector jar。

或者如果您使用maven,pom片段加载mysql连接器,您需要检查最新版本是什么。

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

要运行该示例,请将以下内容保存到文件(query_test.scala)并运行,以下指定连接器jar的类路径:

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

插入,更新和删除

要执行插入,更新或删除,您需要创建可更新的语句对象。 execute命令略有不同,您很可能想要使用某种参数。这是一个使用带有参数的jdbc和scala进行插入的示例。

// create database connection
val 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 insert
try {
  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
}

答案 2 :(得分:8)

您需要在build.sbt中添加依赖项"org.postgresql" % "postgresql" % "9.3-1102-jdbc41",并且可以修改以下代码以连接和查询数据库。将DB_USER替换为db用户和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()
  }
}

答案 3 :(得分:3)

我们正在使用Squeryl,这对我们来说效果很好。根据您的需要,它可以解决问题。

以下是list支持的数据库和adapters

答案 4 :(得分:2)

如果您想/需要编写自己的SQL,但讨厌JDBC接口,请查看O/R Broker

答案 5 :(得分:0)

我会推荐Quill query library。这是Li Haoyi的入门文章。

TL; DR

{
    import io.getquill._
    import com.zaxxer.hikari.{HikariConfig, HikariDataSource}
    val pgDataSource = new org.postgresql.ds.PGSimpleDataSource()
    pgDataSource.setUser("postgres")
    pgDataSource.setPassword("example")
    val config = new HikariConfig()
    config.setDataSource(pgDataSource)
    val ctx = new PostgresJdbcContext(LowerCase, new HikariDataSource(config))
    import ctx._
}

定义一个类ORM:

// mapping `city` table
case class City(
    id: Int,
    name: String,
    countryCode: String,
    district: String,
    population: Int
)

并查询所有项目:

@ ctx.run(query[City])
cmd11.sc:1: SELECT x.id, x.name, x.countrycode, x.district, x.population FROM city x
val res11 = ctx.run(query[City])
                   ^

res11: List[City] = List(
  City(1, "Kabul", "AFG", "Kabol", 1780000),
  City(2, "Qandahar", "AFG", "Qandahar", 237500),
  City(3, "Herat", "AFG", "Herat", 186800),
...

答案 6 :(得分:0)

ScalikeJDBC 非常易于使用。它允许您使用内插字符串编写原始 SQL。

http://scalikejdbc.org/