首页 文章

如何在slick中使用sql“”“插值来编写动态SQL查询

提问于
浏览
16

我是Scala和Slick的新手,并试图用Slick插值编写一个简单的SQL查询 .

案例1:我希望概括代码,以便将查询存储为常量 .

例如:

val SQL_ALL_TABLE_METADATA: String = """SELECT DISTINCT table_name, column_name, data_type
                                            FROM information_schema.columns
                                                    WHERE table_schema = 'apollo' OR table_schema = 'dpa' ORDER BY table_name""";

并从常量之类的东西创建简单查询

var plainQuery = sql"""$SQL_ALL_TABLE_METADATA""".as[List[String]]

案例2:替换部分查询

例如:从表'table1'获取有关列f_name的信息

var column= "f_name"
var plainQuery = sql"""SELECT $column FROM table1""".as[String]

当我尝试上述情况时它不起作用,因为它看起来像查询在编译时静态绑定 .

请注意,到目前为止,我想使用纯SQL并在将来使用高级Slick API .

2 回答

  • 15

    案例1

    为什么不简单地拥有这个?

    val SQL_ALL_TABLE_METADATA: StaticQuery = sql"""SELECT DISTINCT table_name, column_name, data_type
                                                FROM information_schema.columns
                                                        WHERE table_schema = 'apollo' OR table_schema = 'dpa' ORDER BY table_name"""
    
    var plainQuery = SQL_ALL_TABLE_METADATA.as[List[String]]
    

    案例2

    Use #$ instead of $

    var column= "f_name"
    var plainQuery = sql"""SELECT #$column FROM table1""".as[String]
    
  • 0

    我发布了不使用插值的答案,也许有人觉得它很有帮助 .

    我在测试中解决了这个问题,executeUpdate方法返回查询的实际结果 . 我能够从String变量进行动态查询 .

    dbConnection = JdbcBackend.Database.forURL(url = dbConfig.getString("db.url"), driver = "org.h2.Driver")
    val createTablesSqlQuery:String = //read_from_file
    dbConnection.createSession().createStatement().executeUpdate(createTablesSqlQuery)
    

    有用的话题是这个:https://groups.google.com/forum/#!topic/scalaquery/OxAgtcCPMyg

相关问题