2012-12-12 22 views
2

当试图使用scalaquery检索SQLite数据库中文本列的长度时,它会生成错误的SQL。 我得到这个:在scalaquery中为SQLite生成不支持的length()函数

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

查询的时候确实应该

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

for补偿我用得到这个查询

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

而且表DEF我是

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

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

回答

1

您看到的生成SQL使用JDBC escape syntax,更准确地说JDBC escape syntax for fn keyword。这种语法可以被JDBC驱动程序使用,但不幸的是SQLite驱动程序不支持这种语法。

油滑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")" 

如果油滑1.0.0不适合你的工作,我们也许可以找到另一种解决方案。让我知道。