Scala 如何使用SQL编写动态SQL查询&引用&引用;光滑内插

Scala 如何使用SQL编写动态SQL查询&引用&引用;光滑内插,scala,slick,Scala,Slick,我不熟悉Scala和Slick,并试图用Slick插值编写一个简单的SQL查询 案例1: 我希望通用化代码,以便将查询存储为常量 例如: val SQL_ALL_TABLE_METADATA: String = """SELECT DISTINCT table_name, column_name, data_type FROM information_schema.columns

我不熟悉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。

案例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


我张贴的答案,这是没有使用插值,也许有人觉得它有帮助

我在测试中就是这样解决的,executeUpdate方法返回查询的实际结果。 我能够从字符串变量进行动态查询

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

案例2中的插值是否已消毒?如果没有,是否有一种方法来清理我们将使用
$
插入的字符串?@ciuncan不,它没有清理。我不能回答你的第二个问题。它可以是任何东西:列名、表名、模式、查询、查询的一部分…@Dimitri啊,你说得对。在我的例子中,生成常量列值的是列名和字符串文本。它是否也依赖于数据库,或者jdbc只是处理这个问题?如果是这样的话,我正在与Postgresql合作。(编辑:我想象jdbc可能有一些方法来清理这些字符串以进行插值)@ciuncan抱歉,我不知道这样的函数是否可用。好的,谢谢。对于任何需要这种功能的人,我在JdbcDriver-trait中找到了quoteIdentifier函数,我认为它对于转义列和表名应该很有用。如果我发现任何相关信息,我将进一步研究并在这里报告。
dbConnection = JdbcBackend.Database.forURL(url = dbConfig.getString("db.url"), driver = "org.h2.Driver")
val createTablesSqlQuery:String = //read_from_file
dbConnection.createSession().createStatement().executeUpdate(createTablesSqlQuery)