当尝试使用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不适合您,我们可能会找到另一种解决方案。让我知道。