簡體   English   中英

如何在 Scala 中連接到 postgreSQL 數據庫?

[英]How can I connect to a postgreSQL database in scala?

我想知道如何在 Scala 中執行以下操作?

  1. 連接到 postgreSQL 數據庫。
  2. 編寫 SQL 查詢(如 SELECT 、 UPDATE 等)來修改該數據庫中的表。

我知道在 python 中我可以使用 PygreSQL 來做,但是如何在 Scala 中做這些事情?

需要在 build.sbt 中添加依賴"org.postgresql" % "postgresql" % "9.3-1102-jdbc41" ,你可以修改以下代碼來連接和查詢數據庫。 將 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()
  }
}

我建議看看Doobie

“Doobie 之書”中的這一章很好地說明了如果您使用這個庫,您的代碼會是什么樣子。

如果您對 Scala 的純 FP 方面感興趣,即scalazscalaz-stream (很快可能會是fs2cats )和一般的引用透明性,那么這是現在解決這個問題的首選庫。

Doobie 不是 ORM 一文不值。 從本質上講,它只是一個基於 JDBC 的更好、更高級別的 API。

看教程“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 框架有一個名為 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,即加載 mysql 連接器的 pom 片段,您需要檢查最新版本是什么。

<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
}

我們正在使用Squeryl ,到目前為止它對我們來說運行良好。 根據您的需要,它可能會起作用。

這是支持的數據庫和適配器列表

如果您想/需要編寫自己的 SQL,但討厭 JDBC 接口,請查看O/R Broker

我會推薦Quill 查詢庫 這里是李昊毅的介紹帖,開始吧。

TL; 博士

{
    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),
...

ScalikeJDBC 非常易於使用。 它允許您使用內插字符串編寫原始 SQL。

http://scalikejdbc.org/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM