在scalaquery中为SQLite生成的不支持的length()函数



当尝试使用scalaquery检索SQLite数据库中文本列的长度时,它会生成错误的SQL。我明白这个:

SELECT "t1"."title" FROM "GoodPages" "t1" WHERE ({fn length("t1"."title")} > 65)

查询何时真正应该

SELECT "t1"."title" FROM "GoodPages" "t1" WHERE length("t1"."title") > 65

我用于获取此查询的for comp

for (f <- Foo if f.title.length > 65) yield f.title

我拥有的表格定义是

object Foo extends Table[(Int,String)]("Foo") {
  def id = column[Int]("id")
  def title = column[String]("title")
  def * = id ~ title
}

似乎scalaquery只是生成了错误的length()函数,但是我找不到代码中发生这种情况的位置,也没有在Internet上找到有关此的任何内容。

您看到的生成的 SQL 使用 JDBC 转义语法,更准确地说是 fn 关键字的 JDBC 转义语法。JDBC 驱动程序可以使用此语法,但遗憾的是 SQLite 驱动程序不支持此语法。

Slick 1.0.0 知道这一点,因为以下片段来自SQLiteDriver建议

case Apply(j: Library.JdbcFunction, ch) if j != Library.Concat =>
  /* The SQLite JDBC driver does not support ODBC {fn ...} escapes, so we try
   * unescaped function calls by default */
  b"${j.name}("
  b.sep(ch, ",")(expr(_, true))
  b")"
case s: SimpleFunction if s.scalar =>
  /* The SQLite JDBC driver does not support ODBC {fn ...} escapes, so we try
   * unescaped function calls by default */
  b"${s.name}("
  b.sep(s.nodeChildren, ",")(expr(_, true))
  b")"

如果Slick 1.0.0不适合您,我们可能会找到另一种解决方案。让我知道。

最新更新