问题描述
我正在将我的应用程序从 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.SourceCodeGenerator
。 https://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 可用作动态查询的起点,但您需要自己提供大部分框架。