【问题标题】:How do I create dynamic queries using Slick?如何使用 Slick 创建动态查询?
【发布时间】:2021-09-09 04:50:21
【问题描述】:

我正在将我的应用程序从 Cassandra 迁移到 Postgres。虽然我使用 Datastax 驱动程序动态生成 cql 查询,但我在使用 slick 时遇到了麻烦。

当我说动态时,我的意思是我从服务中获取我的列名及其值作为映射 {(key, v) => key.name -> v},我希望将它们插入生成的查询中在我的 Postgres DAO API 中使用 slick。

这是 Cassandra 的示例代码:


 private lazy val getStatement: PreparedStatement = {
    val select: Select = QueryBuilder.select(valueColumns.map(_.name): _*).from(KeyspaceName, TableName)

    val where: Where = select.where()

    keyColumns.foreach(col => where.and(QueryBuilder.eq(col.name, bindMarker)))

    table.session.getSession.prepare(select)
  }




 val bs: BoundStatement = getStatement.bind
          val updatedKeys = keys.map { case (column, value) => (column, Option(value)) }
          writeKeys(updatedKeys, bs) //this method modifies the bound statement to plug in values

          val resultSet: ResultSet = table.session.getSession.execute(bs)

有什么替代方法 - 以便在不同表中更好地重用某个查询。还要进一步将其扩展到不同的列名?

如何使用 slick 实现这一点?

【问题讨论】:

    标签: postgresql scala dao slick


    【解决方案1】:

    如果我对问题的理解正确,您需要一种自动生成表实体的方法。 请查看slick.codegen.SourceCodeGeneratorhttps://scala-slick.org/doc/3.2.1/code-generation.html

    object SchemaCodeGen extends App {
      slick.codegen.SourceCodeGenerator.main(
        Array(
          // Postgres Config
          "slick.jdbc.PostgresProfile",
          "org.postgresql.Driver",
          "jdbc:postgresql://localhost:5432/db_name?user=user_name",
          "/Users/ashwinsreekumar/Desktop/app_name/app",
          "models.tables"
         
        )
      )
      Seq.empty
    }
    

    【讨论】:

      【解决方案2】:

      Slick 旨在通过使用基于 Scala 版本的数据库模式的所有表及其字段的类型化版本来允许对数据库操作进行编译时检查。这些数据类型可以从数据库模式中自动生成,也可以由程序员手动创建,但它们总是在程序编译之前创建。

      使用 Slick 在仅在运行时才知道的模式上动态创建查询并没有真正利用库的优势。 Slick 提供了Plain SQL Queries,可以用作动态查询的起点,但您需要自己提供大部分框架。

      【讨论】:

        猜你喜欢
        • 2015-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        • 2018-10-27
        • 1970-01-01
        • 2013-09-16
        • 2021-08-10
        相关资源
        最近更新 更多