2016-05-14 8 views
0

Ich benutze Anorm für einfache db Rohöl, gibt es ein Problem mit Silent-Fail, wenn der Eingabeparameter single quote enthält. ZB Nachname "O'Brien" oder "O'Neill" in Benutzertabelle. Ich habe versucht, das doppelte Anführungszeichen zu verwenden, um das einfache Anführungszeichen in der Abfrage zu umgehen. Dadurch wird das stille Fehlschlagen entfernt. Der Datenbankeintrag enthält jedoch den Nachnamen "O'Brien" und "O'Neill". Was ist der richtige Weg, um ein einfaches Zitat zu vermeiden?Anorm: Escape Single-Zitat

Der Code sieht aus wie (sorry tragen Sie sich bitte mit der Formatierung Registerkarten in SO):

def insertNewUser(user: User): \/[Exception, UUID] = DB.withConnection { implicit connection => 
val updatedRowCount = 
    SQL"""insert into user(id, email, first_name, surname) 
     values (${user.id}::uuid, ${user.email}, ${sanitiseSqlQueryInput(user.firstName)}, 
     ${sanitiseSqlQueryInput(user.surname)})""".executeUpdate() 
updatedRowCount match { 
    case 1 => 
    log.debug(s"New user is successfully created [userId=${user.id.toString}]") 
    \/-(user.id) 
    case _ => -\/(new Exception(s"""Fail to create new user [id=${user.id.toString}] [email=${user.email}] [user=$user]""")) 
}} 

def sanitiseSqlQueryInput(s: String): String = s.replace("'", "''") 

Vielen Dank im Voraus!

Meine Antwort kann begrenzt sein, da ich noch nicht kommentieren kann.

Antwort

2

Mit dem SQL Interpolator müssen Sie nicht. Anorm erstellt eine vorbereitete Aussage für Sie. Beachten Sie die Parameter-Mapping im Ergebnis res0:

scala> val name = "O'Neill" 
name: String = O'Neill 

scala> SQL"""SELECT ${name}""" 
res0: anorm.SimpleSql[anorm.Row] = SimpleSql([email protected],Map(_0 -> ParameterValue(O'Neill)),<function1>,false) 
                       ^
                   // --------------| 

Sie können einfach schreiben:

SQL""" 
    insert into user (id, email, first_name, surname) values 
    (${user.id}, ${user.email}, ${user.firstName}, ${user.surname}) 
    """.executeUpdate()