2010-07-07 169 views
18

我想知道如何在scala中执行以下操作?如何连接到scala中的postgreSQL数据库?

  1. 连接到postgreSQL数据库。
  2. 编写SELECT,UPDATE等SQL查询来修改该数据库中的表。

我知道在python中,我可以使用PygreSQL,但如何在scala中执行这些操作?

回答

11

看看教程"Using Scala with JDBC to connect to MySQL",更换db url并添加正确的jdbc库。链接有这么这里被打破的博客的内容:

使用Scala的使用JDBC连接到MySQL

一份HOWTO上Scala的使用JDBC连接到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罐子。

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

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

要运行的例子中,保存以下到一个文件(query_test.scala),并使用下列指定的类路径到连接器罐运行:

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

插入,更新和删除

要执行插入,更新或删除,您需要创建可更新的语句对象。执行命令略有不同,你很可能想使用某种参数。下面是一个使用带有参数的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 
} 
+1

fyi,链接被破坏 – 2015-09-08 05:30:45

+0

谢谢你,我已经修复了它 – 2015-09-08 09:02:05

+6

是不是问题如何连接到postgres sql? – 2015-09-27 00:53:45

3

我们正在使用Squeryl,这对我们来说目前运行良好。根据您的需求,它可能会诀窍。

下面是支持DB的一个listadapters

1

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

+1

该链接目前已被打破。 – jedesah 2016-07-27 22:16:48

+1

@jedesah固定。 – nilskp 2016-07-28 01:45:55

+0

我想知道是否提供了“五年或更多年后纠正的断开链接”的徽章。我想,“长期维护”徽章。加一。我会把它称为“去经纪人”。 – 2016-07-28 06:32:07

6

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

我建议看看Doobie

This“Doobie书”中的章节很好地说明了如果使用这个库,你的代码将会是什么样子。

这是选择的库现在如果你有兴趣在斯卡拉的纯FP方来解决这个问题,即scalazscalaz-stream一般(大概fs2cats推出)和引用透明。

Doobie不是一个ORM。从核心来看,它仅仅是一个更好的,更高层次的基于JDBC的API。

相关问题