2013-04-08 9 views
5

użyciu ramy zabaw 2.1, próbuję znaleźć najlepszy sposób, aby mieć dwóch różnych baz danych konfiguracje:Użycie Mysql w dev/prod i H2 w teście

  • One uruchomić mój wniosek w oparciu o mysql
  • Jeden przetestować mój wniosek na podstawie H2

Choć jest to bardzo proste do wykonania jednego lub drugiego, biegnę na następujące problemy, gdy próbuję zrobić zarówno:

  1. Nie mogę mieć tych samych zmian w bazie danych, ponieważ istnieją pewne polecenia specyficzne dla mysql, które nie działają z H2, nawet w trybie mysql: oznacza to dwa zestawy zmian i dwie osobne nazwy bazy danych
  2. Nie jestem pewien, jak zastąpić główny plik application.conf innego zarezerwowanego do testowania w trybie testowym. To, co próbowałem (podanie nazwy pliku lub przesłanianie klawiszy z wiersza poleceń) wydaje się być zarezerwowane dla trybu prod.

Moje pytanie: Czy ktokolwiek może zalecić dobry sposób robienia obu (mysql przez cały czas i tylko H2 w teście) bez zbytniego komplikowania uruchamiania aplikacji? Google mi nie pomógł.

Dzięki za pomoc.

+0

P.S. właśnie znalazłem: http://play.lighthouseapp.com/projects/82401/tickets/981-overriding-configuration-for-tests ze statusem 'wontfix' – biesior

+0

Dzięki. To wyjaśnia to. –

Odpowiedz

2

Korzystanie z różnych silników baz danych jest prawdopodobnie najgorszym możliwym scenariuszem, jak sam pisałeś: różnice w niektórych funkcjach, zarezerwowane słowa kluczowe itp. Powodują, że musisz napisać czasami niestandardowe stwierdzenia bardzo specyficzne dla wybranego silnika DB. Lepiej korzystaj z dwóch oddzielnych baz danych przy użyciu tego samego silnika.

Niestety nie wiem problemy z config nadrzędnych, więc jeśli domyślne sposoby nadrzędnymi configs nie ... ID override w application.conf - dzięki czemu będziemy w stanie wypowiedzieć się cały blok szybko ...)

+0

+1 za "* najgorszy możliwy scenariusz *" –

+2

To prawdopodobnie jest tryb kompatybilności H2 MySQL. –

+0

ORM może negować różnice w silniku DB, do pewnego stopnia –

1

Oto jak korzystać z bazy danych w pamięci do testów:

public class ApplicationTest extends WithApplication { 
    @Before 
    public void setup() { 
     start(fakeApplication(inMemoryDatabase("default-test"), fakeGlobal())); 
    } 

    /// skipped .... 
} 

inMemoryDatabase() użyje sterownika H2 domyślnie. Więcej informacji można znaleźć pod adresem source code

5

Istnieje kilka sztuczek, które mogą okazać się przydatne.

Po pierwsze, /*! */ notacja MySQL pozwala na dodanie kodu, który będzie posłuszny MySQL, ale inny DB zignoruje, na przykład:

create table Users (
    id bigint not null auto_increment, 
    name varchar(40) 
) /*! engine=InnoDB */ 

To nie jest panaceum, ale to niech ci papier na niektóre różnic między składnią MySQL i H2. To jest MySQL-ism, więc nie pomoże z innymi bazami danych, ale ponieważ większość innych baz danych nie jest tak dziwaczna jak MySQL, prawdopodobnie nie byłaby potrzebna - przenieśliśmy naszą bazę danych z MySQL do PostgreSQL, która nie obsługuje notację /*! */, ale PostgreSQL jest na tyle podobny do H2, że go nie potrzebowaliśmy.

Jeśli chcesz użyć innej konfiguracji dla dewelopera i prod, prawdopodobnie lepiej będzie mieć dodatkową konfigurację dla prod. Powodem jest to, że prawdopodobnie uruchomisz serwer dev z play run i uruchomisz swój serwer prod z play stage; target/start. target/start może przyjmować parametr -Dconfig.resource.Na przykład można utworzyć dodatkowy plik konfiguracyjny prod.conf dla prod, który wygląda tak:

include "application.conf" 

# Extra config for prod - this will override the dev values in application.conf 
db.default.driver=... 
db.default.url=... 
... 

i stworzyć start_prod skrypt, który wygląda tak:

#!/bin/sh 

# Optional - you might want to do this as part of the build/deploy process instead 
#play stage 
target/start -Dconfig.resource=prod.conf 

Teoretycznie można to zrobić na odwrót, i mają application.conf zawierać prod conf, i utworzyć plik dev.conf, ale prawdopodobnie będziesz chciał uruchomić skrypt mimo to (prawdopodobnie będziesz potrzebował dodatkowych parametrów JVM/memory/GC, lub dodać go do rc.d , lub cokolwiek).

+0

bardzo pomocne, dziękuję – LiorH

Powiązane problemy