如何使用 Slick 创建动态查询?

问题描述

我正在将我的应用程序从 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 实现这一点?

解决方法

如果我理解正确,您需要一种自动生成表实体的方法。 请查看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
}
,

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...