在使用scalikejdbc的过程中,有时会操作一些通过表名进行分区的表,如table_202112这种月分区的表,我们使用${}占位符进行查询会报错,因为${}会以占位符的形式处理参数

通过查阅官方文档,发现官方文档提供了sqls方法进行sql插值,但不是太灵活,只能使用固定好的值,做不到动态的表名:

//只能使用固定的table1或者table2表,无法根据日期动态生成
val tableName = if (xxx) sqls"table1" else sqls"table2"
val query = sql"select * from ${tableName}"
  .map(_.toMap)
  .list
  .apply()

我通过翻阅代码,找到了一个可以创建非占位符的参数的方法:
通过SQLSyntax.createUnsafely创建一个非占位符的参数,但是要注意,这个参数会被直接拼接进sql中,应该小心使用,以免产生sql注入等安全漏洞。

val sqlTableName = SQLSyntax.createUnsafely(s"table_${DateUtil.getMonth}")
val query = sql"select * from ${tableName}"
  .map(_.toMap)
  .list
  .apply()