我想知道如何在scala中执行以下操作?
我知道在python中我可以使用PygreSQL来做但是如何在scala中做这些事情?
答案 0 :(得分:14)
我建议您查看Doobie。
“Book of Doobie”中的This章节可以很好地了解如果您使用此库,您的代码将会是什么样子。
如果您对Scala的纯FP方面感兴趣,即scalaz
,scalaz-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)
答案 4 :(得分:2)
如果您想/需要编写自己的SQL,但讨厌JDBC接口,请查看O/R Broker
答案 5 :(得分:0)
我会推荐Quill query library。这是Li Haoyi的入门文章。
{
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。