2010-07-07 168 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。

相關問題