우리는 스칼라 플레이를 사용하고 있으며 모든 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를 사용하지 않기 때문에 이것은 나쁘다.
, Anorm 보간의 오해가있다 표준 스칼라 보간 및 PreparedStatement. – cchantep