2015-01-10 9 views
3

우리는 스칼라 플레이를 사용하고 있으며 모든 SQL 쿼리가 Anorm의 문자열 보간법을 사용하고 있는지 확인하려고합니다. 일부 쿼리에서는 작동하지만 쿼리가 실행되기 전에 실제로 많은 변수가 대체되지 않습니다.Anorm String 변수를 대체하지 않는 보간

import anorm.SQL 
import anorm.SqlStringInterpolation 

object SecureFile 
{ 
    val table = "secure_file" 
    val pk = "secure_file_idx" 
    ... 

// This method works exactly as I would hope 
def insert(secureFile: SecureFile): Option[Long] = { 
    DBExec { implicit connection => 
    SQL""" 
     INSERT INTO secure_file (
     subscriber_idx, 
     mime_type, 
     file_size_bytes, 
     portal_msg_idx 
    ) VALUES (
     ${secureFile.subscriberIdx}, 
     ${secureFile.mimeType}, 
     ${secureFile.fileSizeBytes}, 
     ${secureFile.portalMsgIdx} 
     ) 
     """ executeInsert() 
    } 
    } 

def delete(secureFileIdx: Long): Int = { 
    DBExec { implicit connection => 
    // Prints correct values 
    println(s"table: ${table} pk: ${pk} secureFileIdx: ${secureFileIdx} ") 

    // Does not work 
    SQL""" 
     DELETE FROM $table WHERE ${pk} = ${secureFileIdx} 
    """.executeUpdate() 

    // Works, but unsafe 
    val query = s"DELETE FROM ${table} WHERE ${pk} = ${secureFileIdx}" 
    SQL(query).executeUpdate() 
    } 
} 
.... 
} 

이상 PostgreSQL의 로그에, 그것은 삭제 문이 올바른 값을 인수하지 않았 음을 명확 : 나는 비슷한 결과 많은, executeUpdate의 실행의 변화, 그리고하는 executeQuery을 시도했습니다

2015-01-09 17:23:03 MST ERROR: syntax error at or near "$1" at character 23 
2015-01-09 17:23:03 MST STATEMENT: DELETE FROM $1 WHERE $2 = $3 
2015-01-09 17:23:03 MST LOG: execute S_1: ROLLBACK 

. 잠시 동안, 우리는 기본적인 문자열 대체를 사용하고 있습니다 만, 물론 PreparedStatements를 사용하지 않기 때문에 이것은 나쁘다.

+0

, Anorm 보간의 오해가있다 표준 스칼라 보간 및 PreparedStatement. – cchantep

답변

4

Anorm 문자열 보간 (예를 들어 SQL"Select * From Test Where id = $x) 적절한 형식 변환 (https://www.playframework.com/documentation/2.3.x/ScalaAnorm에 사용 사례를 참조)에 따른 기본 설정 PreparedStament 보간 인자 (예컨대 $x)에 매개 변수를 전달하기 위해 도입되었다.

다음 Anorm 릴리스에는 표준 문자열 보간과 매개 변수의 보간을 혼합하는 #$foo 구문이 있습니다. 이렇게하면 DELETE FROM #$table WHERE #${pk} = ${secureFileIdx}을 작성하고 DELETE FROM foo WHERE bar = ? (문자가 table 인 경우 "foo"이고 pk"bar" 인 경우)을 매개 변수로 전달하면 secureFileIdx이 매개 변수로 전달됩니다. 관련 pull request을 참조하십시오.

다음 개정판이 발표 될 때까지이 변경 사항을 적용한 마스터 소스에서 Anorm을 빌드 할 수 있습니다.

자신의 머리를 긁적 그들이 누락 될 수 있습니다 궁금이 페이지에 앉아 다른 사람들을위한
4

...

SQL("select * from mytable where id = $id") 

SQL"select * from mytable where id = $id" 

문자열 보간을하지 않습니다 이전과 동일하지 않습니다 후자는 그렇지 않습니다.

이 쉽게 단지 (이 문장이하는 것처럼) 그들에 (비 관련) 닫는 괄호가하는 일이 제공하는 모든 샘플로 상기 문서에 간과은

+0

감사합니다. 나는 왜 내가 * ERROR를 얻었는지 궁금해하는데 너무 많은 시간을 보냈다 : 이것을 발견하고 괄호로'SQL()'을 시도 할 때까지 "{"id = – Jonik