2016-08-08 53 views
1

Ich entwickle eine Scala/Play-Anwendung, die mysql verwendet. Ich bin auf ein Problem gestoßen, bei dem meine Anwendung bei der Bereitstellung in unserer Integrationsumgebung beschädigt wird, weil die SQL-Abfragen aus meiner Anwendung den Fall für Tabellen und Aliase falsch darstellen. Ich habe das in der Entwicklung nicht bemerkt, weil ich auf einem Mac bin, wo MySQL standardmäßig nicht zwischen Groß- und Kleinschreibung unterscheidet. Abgesehen davon, dass ich meine lokale Umgebung so konfiguriere, dass auch Groß- und Kleinschreibung beachtet wird, möchte ich, dass die Komponententests fehlschlagen, wenn Abfragen geschrieben werden, bei denen der Fall falsch ist. Ich teste die Datenbank mit H2 wie von der Play documentation beschrieben. Ich habe die Datenbank mit dem folgenden Code, wo Schema ist eine Zeichenfolge, die die Erstellung Skript hat:So testen Sie die Sensitivität der MySQL-Groß-/Kleinschreibung mit H2

def apply[T](block: Database => T):Unit = { 
    Databases.withInMemory(
    urlOptions = Map(
     "MODE" -> "MYSQL" 
    ), 
    config = Map(
     "logStatements" -> false 
    ) 
    ){ 
    database => 
    Evolutions.withEvolutions(database, SimpleEvolutionsReader.forDefault(
     Evolution(
     1, 
     schema, 
     "" 
    ) 
    )){ 
     block(database) 
    } 
    } 
} 

wäre eine Option wie "caseSensitive" -> true oder so ähnlich Intuitiv die Config-Karte hat, aber ich habe nicht in der Lage gewesen zu finden Sie Dokumentation für alle Optionen dort. Weiß jemand, ob H2 eine Konfigurationsoption dafür hat und was es ist?

Antwort

3

, die von beiden H2 docs-and-Play-Dokumentation erklärt (die im Grunde zitiert H2 docs sind):

In MySQL Textspalten sind Groß- und Kleinschreibung standardmäßig, während in H2 sie Groß- und Kleinschreibung. Allerdings unterstützt H2 auch Groß- und Kleinschreibung. Um die Tabellen mit case-insensitiven Texten zu erstellen, hängen Sie IGNORECASE=TRUE an die Datenbank-URL an (Beispiel: jdbc:h2:~/test;IGNORECASE=TRUE).

Und von Play docs:

Textvergleich in MySQL ist Groß- und Kleinschreibung standardmäßig, während in H2 ist es Groß- und Kleinschreibung (wie in den meisten anderen Datenbanken). H2 unterstützt den Vergleich von Groß- und Kleinschreibung, aber es muss separat eingestellt werden, mit SET IGNORECASE TRUE. Dies beeinflusst den Vergleich unter Verwendung von =, LIKE, REGEXP.

Also, müssen Sie Ihre urlOptions ändern IGNORECASE Parameter zu berücksichtigen:

def apply[T](block: Database => T): Unit = { 
    Databases.withInMemory(
    urlOptions = Map(
     "MODE" -> "MYSQL", 
     "IGNORECASE" -> "TRUE" 
    ), 
    config = Map(
     "logStatements" -> false 
    ) 
) { 
    database => 
     Evolutions.withEvolutions(database, SimpleEvolutionsReader.forDefault(
     Evolution(
      1, 
      schema, 
      "" 
     ) 
    )) { 
     block(database) 
     } 
    } 
} 

Aber ich gegen die Verwendung einer anderen Datenbank-Engine einsetzen würde, wenn Ihre Integrationstests ausgeführt werden. Versuchen Sie, dieselbe Datenbank zu verwenden, die in der Produktion verwendet wird, da dies Ihren Tests mehr Sicherheit verleiht.

+0

Vielen Dank, dass Sie auf diese Dokumentation hingewiesen haben. Leider ist es nicht das, wonach ich gesucht habe. Wie gesagt, die IGNORECASE-Option wirkt sich auf Daten im Vergleich aus, scheint aber keine Konsequenzen für Metadaten wie Tabellennamen und Aliase zu haben. –

+1

Ich stimme auch Ihren Ratschlägen zu Integrationstests zu, aber das ist es nicht. Es ist lediglich dazu gedacht, bei Komponententests zu helfen, die oft in Teilen unserer Pipeline ausgeführt werden, für die keine MySQL-Instanz verfügbar ist, wie z. B. der Build/Test-Trigger, der beim Commit ausgeführt wird. Unsere Integrationstests sind etwas weiter unten und mit dem eigentlichen MySQL-Treiber erledigt. –