首页 > 解决方案 > 使用 Akka.io 从 Azure SQL 数据库中提取数据

问题描述

目前,我可以使用 intelliJ 创建会话:

  //sqlserver is the name of application.conf {}
  val databaseConfig = DatabaseConfig.forConfig[JdbcProfile]("sqlserver") 
  implicit val session = SlickSession.forConfig(databaseConfig)

这是配置:

sqlserver = {
  profile = "slick.jdbc.SQLServerProfile$"
  db {
    driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
    host = <myHostName> e.g. myresource.database.windows.net
    port = <myPortNumber> e.g 1433
    databaseName = <myDatabaseName>

    url = <jdbc:sqlserver:myHostName:port;database=myDatabase>
    user = <user>
    password = <password>
    connectionTimeout = "30 seconds"
  }
}

建议的一些方法是:

// The example domain
case class User(id: Int, name: String)
val users = (1 to 42).map(i => User(i, s"Name$i"))

// This import enables the use of the Slick sql"...",
// sqlu"...", and sqlt"..." String interpolators.
// See "http://slick.lightbend.com/doc/3.2.1/sql.html#string-interpolation"
import session.profile.api._

// Stream the users into the database as insert statements
val done: Future[Done] =
  Source(users)
    .via(
      // add an optional first argument to specify the parallelism factor (Int)
      Slick.flow(user => sqlu"INSERT INTO ALPAKKA_SLICK_SCALADSL_TEST_USERS VALUES(${user.id}, ${user.name})")
    )
    .log("nr-of-updated-rows")
    .runWith(Sink.ignore)

我找不到任何方法示例让我使用 Akka.io 中的 SQL 命令提取任何数据。最接近的是这个链接:[Akka.io Slink JDBC][1]

此时,连接没有错误,但我仍然缺乏使用 Query 方法从 Azure SQL 数据库访问和下载的方法。

这个看起来像是在创建它自己的向量列表。

case class User(id: Int, name: String)
val users = (1 to 42).map(i => User(i, s"Name$i"))

结果:向量(User(1,Name1), User(2,Name2), ....)

有没有一种方法可以从 Azure SQL 服务器中提取我的数据?[1]:https ://doc.akka.io/docs/alpakka/current/slick.html

标签: scalaakkaazure-sql-databaseakka-stream

解决方案


如果你想从 SQL Server 获取数据到 Akka Stream,你需要一个Source,而不是 a Sink(用于从 Akka 写入数据库)。

因为 Alpakka 将 JDBC 集成推迟到Slick库,所以可能值得阅读该库。

从文档中,您将需要以下内容:

import slick.jdbc.GetResult
import session.profile.api._

case class User(id: Int, name: String)

// Define how to transform result rows (each row being a PositionedResult)
// into Users.  See https://scala-slick.org/doc/3.3.2/sql.html
implicit val getUserFromResult = GetResult(r => User(r.nextInt, r.nextString))

val gotAllUsers: Future[Done] =
  Slick.source(sql"SELECT id, name FROM table".as[User])
    .log("user")
    .runWith(Sink.ignore)

// Wait for the query to complete before exiting, only useful for this example.
Await.result(gotAllUsers, Duration.Inf)

推荐阅读