2012-12-12 23 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不適合你的工作,我們也許可以找到另一種解決方案。讓我知道。