Coder Social home page Coder Social logo

flyway-play's Introduction

flyway-play

Scala CI

Flyway module for Play 2.4 or later. It aims to be a substitute for play-evolutions.

Features

  • Based on Flyway
  • No 'Downs' part.
  • Independent of DBPlugin(play.api.db).

Install

flyway-play version play version flyway version
9.1.0 3.0.x 9.16.0
9.0.0 3.0.x 9.16.0
8.0.1 2.9.x 9.16.0
7.38.0 2.8.x 9.16.0
7.21.0 2.8.x 8.5.0
7.14.0 2.8.x 7.14.0
6.5.0 2.8.x 6.5.7

build.sbt

libraryDependencies ++= Seq(
  "org.flywaydb" %% "flyway-play" % "9.1.0"
)

conf/application.conf

play.modules.enabled += "org.flywaydb.play.PlayModule"

Maintenance

This repository is a community project and not officially maintained by the Flyway Team at Redgate. This project is looked after only by the open source community. Community Maintainers are people who have agreed to be contacted with queries for support and maintenance. Community Maintainers:

If you would like to be named as a Community Maintainer, let us know via Twitter: https://twitter.com/flywaydb.

Getting Started

Basic configuration

Database settings can be set in the manner of Play2.

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:example2;db_CLOSE_DELAY=-1"
db.default.username="sa"
db.default.password="secret"

# optional
db.default.migration.schemas=["public", "other"]

Place migration scripts

A migration script is just a simple SQL file.

CREATE TABLE FOO (.............

By default place your migration scripts in conf/db/migration/${dbName} .

If scriptsDirectory parameter is set, it will look for migrations scripts in conf/db/migration/${scriptsDirectory} .

playapp
├── app
│   ├── controllers
│   ├── models
│   └── views
├── conf
│   ├── application.conf
│   ├── db
│   │   └── migration
│   │       ├── default
│   │       │   ├── V1__Create_person_table.sql
│   │       │   └── V2__Add_people.sql
│   │       └── secondary
│   │           ├── V1__create_job_table.sql
│   │           └── V2__Add_job.sql
│   ├── play.plugins
│   └── routes

Alternatively, specify one or more locations per database and place your migrations in conf/db/migration/${dbName}/${locations[1...N]} . By varying the locations in each environment you are able to specify different scripts per RDBMS for each upgrade. These differences should be kept minimal.

For example, in testing use the configuration:

db.default.migration.locations=["common","h2"]

And in production use the configuration:

db.default.migration.locations=["common","mysql"]

Then put your migrations in these folders. Note that the migrations for the secondary database remain in the default location.

playapp
├── app
│   ├── controllers
│   ├── models
│   └── views
├── conf
│   ├── application.conf
│   ├── db
│   │   └── migration
│   │       ├── default
│   │       │   ├── common
│   │       │   │   └── V2__Add_people.sql
│   │       │   ├── h2
│   │       │   │   └── V1__Create_person_table.sql
│   │       │   └── mysql
│   │       │       └── V1__Create_person_table.sql
│   │       └── secondary
│   │           ├── V1__create_job_table.sql
│   │           └── V2__Add_job.sql
│   ├── play.plugins
│   └── routes

Please see flyway's documents about the naming convention for migration scripts.

https://flywaydb.org/documentation/migration/sql.html

Placeholders

Flyway can replace placeholders in Sql migrations. The default pattern is ${placeholder}. This can be configured using the placeholderPrefix and placeholderSuffix properties.

The placeholder prefix, suffix, and key-value pairs can be specified in application.conf, e.g.

db.default.migration.placeholderPrefix="$flyway{{{"
db.default.migration.placeholderSuffix="}}}"
db.default.migration.placeholders.foo="bar"
db.default.migration.placeholders.hoge="pupi"

This would cause

INSERT INTO USERS ($flyway{{{foo}}}) VALUES ('$flyway{{{hoge}}}')

to be rewritten to

INSERT INTO USERS (bar) VALUES ('pupi')

Enable/disable Validation

From flyway 3.0, validate run before migrate by default. Set validateOnMigrate to false if you want to disable this.

db.${dbName}.migration.validateOnMigrate=false // true by default

Migration prefix

Custom sql migration prefix key-value pair can be specified in application.conf:

db.${dbName}.migration.sqlMigrationPrefix="migration_"

Insert Query

If you want to apply your migration not via the web interface, but manually on your production databases you also need the valid insert query for flyway.

db.${dbName}.migration.showInsertQuery=true

Dev

screenshot

For existing schema, Flyway has a option called 'initOnMigrate'. This option is enabled when -Ddb.${dbName}.migration.initOnMigrate=true. For example,

$ play -Ddb.default.migration.initOnMigrate=true

Of course, You can write this in your application.conf.

Manual migration is also supported. Click 'Other operations' or open /@flyway/${dbName} directly.

screenshot

Test

In Test mode, migration is done automatically.

Prod

In production mode, migration is done automatically if db.${dbName}.migration.auto is set to be true in application.conf. Otherwise, it failed to start when migration is needed.

$ play -Ddb.default.migration.auto=true start

Example application

seratch/devteam-app is using play-flyway. Maybe this is a good example.

compile-time DI support

class MyComponents(context: Context)
    extends BuiltInComponentsFromContext(context)
    with FlywayPlayComponents
    ...
    {
  flywayPlayInitializer
  ...
}

License

  • Apache 2.0 License

flyway-play's People

Contributors

aziegler avatar baztoune avatar bitespresso avatar dependabot[bot] avatar dziman avatar etspaceman avatar gakuzzzz avatar gomes-rocket avatar jopecko avatar k4200 avatar kenichiro22 avatar markterm avatar mikielagutu avatar mipe avatar muuki88 avatar nafg avatar nlochschmidt avatar readmecritic avatar scala-steward avatar scubacabra avatar slivkamiro avatar sullis avatar tilmanginzel avatar tkawachi avatar tototoshi avatar xuwei-k avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flyway-play's Issues

Flyway 6 support

Flyway 6 has been released in August 2019. It features support for many new DB version such as PostgreSQL 11 and 12. flyway-play should to be updated to support Flyway 6.

Add new configuration parameter - dbFolder

Hi,
I have play configured to deal with multiple modules. My migration folder structure is based on module names.
It would be very useful to add a new configuration parameter, called for instance dbFolder. That parameter would be used to set the path to the DB migrations.

Currenlty the path to the files are under
migrationFilesLocation = s"$flywayPrefixToMigrationScript/$dbName"

It would be useful to have like an alias, if configuration is set, use configuration value otherwise use dbName. If would a minor change
migrationFilesLocation = s"$flywayPrefixToMigrationScript/configuration.dbFolder"

With this new parameter i could have like this in my setup:

db.finance_ke.url = ....
db.finance_ke.migration.dbFolder = finance
db.finance_ma.url = ....
db.finance_ma.migration.dbFolder = finance
db.finance_eg_url = ....
db.finance_eg.migration.dbFolder = finance

So, i could have

+---- /conf
+--------- /db
+------------- /migration
+---------------------/finance
+---------------------------V1__testing.sql

What do you think? I need help on having folder name, not matching the DB name.
Check PR here #61

Migrations not happening automatically in production

Plugins
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.7.0")

build.sbt
libraryDependencies += "org.flywaydb" %% "flyway-play" % "5.3.1"

Running play application in Dev mode, migrations are prompted as expected.
Running same application in Prod mode, doesn't run migration scripts.

production.conf

play.modules.enabled += "org.flywaydb.play.PlayModule"
db.default.migration.initOnMigrate=true
db.default.migration.auto=true

Starting the server with:
./server -Dconfig.resource=production.conf

Startup logging:

[info] p.a.d.DefaultDBApi - Database [default] initialized at jdbc:postgresql://localhost/toprail
[info] application - Creating Pool for datasource 'default'
[info] play.api.Play - Application started (Prod) (no global state)
[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
[error] c.s.h.t.d.PrintlnRequestLogger - org.postgresql.util.PSQLException: ERROR: relation "users" does not exist

Users table "should" have been created with migration scripts however they are not run.

This is happening on a blank database so it needs to init the flyway_schema_history table.

Any help much appreciated.

Error when starting from scratch: CreationException: Unable to create injector, see the following errors:

Every time when I change one of my models and Play wants to re-apply the evolutions scripts I get the following error:

1) Error injecting constructor, @6mm01i5n4: Database 'default' needs migration!
  at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:31)
  at org.flywaydb.play.PlayModule.bindings(PlayModule.scala:24):
Binding(class org.flywaydb.play.PlayInitializer to self eagerly) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
  while locating org.flywaydb.play.PlayInitializer
Caused by: @6mm01i5n4: Database 'default' needs migration!
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$checkState$1.apply(PlayInitializer.scala:104)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$checkState$1.apply(PlayInitializer.scala:101)
    at scala.Option.foreach(Option.scala:257)
...

What am I doing wrong, I would like to apply the generated .sql from Play and let Flyway run the scripts afterwards..

Update Readme.md for configuration with MySQL

Thanks for supporting also Play! version 3.0.x!
As I tried to make it run for MySql, I noticed that there is an additional dependency needed in build.sbt:

libraryDependencies += "org.flywaydb" % "flyway-mysql" % "9.16.3"

May you update the README to makes this clear for other users? The version must be in sync with what is used in flyway-play as otherwise it will not compile

Proposing to move this repo to the playframework org

Hi everyone and @tototoshi,

I am in contact with @alistair-RG from the Flyway team at Redgate. They want to have some tidy-up done this year and this is why we will very likely move this repo to the https://github.com/playframework/ organization.
After the move we will also change the groupid to org.playframework.

@tototoshi Even if we move this repo, can you continue to maintain it? I will help to set up GitHub actions workflows for publishing, etc. but is it ok if you stay the main maintainer of this repo?

Thanks!

cleanDisabled support

Currently cleanDisabled param seems to be not supported (neither flyway.cleanDisabled nor db.cleanDisabled). Please add support of this option.

Repeatable migrations cause NPE when clicking on 'Other Operations'

When a repeatable migration is put into the migrations folder, clicking on 'Other Operations' in the flyway-play module ui causes a NullPointerException in info.template.scala. Removing the repeatable makes it work again. Tested with play framework 2.5.6.

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[NullPointerException: null]]
    at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:280)
    at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:206)
    at play.core.server.Server$class.logExceptionAndGetResult$1(Server.scala:45)
    at play.core.server.Server$class.getHandlerFor(Server.scala:65)
    at play.core.server.NettyServer.getHandlerFor(NettyServer.scala:47)
    at play.core.server.netty.PlayRequestHandler.handle(PlayRequestHandler.scala:82)
    at play.core.server.netty.PlayRequestHandler.channelRead(PlayRequestHandler.scala:163)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345)
    at com.typesafe.netty.http.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:129)
    at com.typesafe.netty.http.HttpStreamsServerHandler.channelRead(HttpStreamsServerHandler.java:96)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345)
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:267)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1294)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:911)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:572)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:513)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:427)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:399)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:140)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: null
    at org.flywaydb.play.views.html.info$$anonfun$apply$1.apply(info.template.scala:63)
    at org.flywaydb.play.views.html.info$$anonfun$apply$1.apply(info.template.scala:62)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.immutable.List.foreach(List.scala:381)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
    at scala.collection.immutable.List.map(List.scala:285)
    at org.flywaydb.play.views.html.info.apply(info.template.scala:62)
    at org.flywaydb.play.FlywayWebCommand.handleWebCommand(FlywayWebCommand.scala:64)
    at play.core.DefaultWebCommands$$anonfun$handleWebCommand$1.apply(WebCommands.scala:40)
    at play.core.DefaultWebCommands$$anonfun$handleWebCommand$1.apply(WebCommands.scala:40)
    at scala.collection.immutable.Stream.flatMap(Stream.scala:489)
    at play.core.DefaultWebCommands.handleWebCommand(WebCommands.scala:40)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$handleWebCommand$1$$anonfun$apply$7.apply(DevServerStart.scala:203)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$handleWebCommand$1$$anonfun$apply$7.apply(DevServerStart.scala:203)
    at scala.Option.flatMap(Option.scala:171)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$handleWebCommand$1.apply(DevServerStart.scala:203)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$handleWebCommand$1.apply(DevServerStart.scala:203)
    at scala.Option.orElse(Option.scala:289)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1.handleWebCommand(DevServerStart.scala:202)
    at play.core.server.Server$class.getHandlerFor(Server.scala:49)
    ... 31 common frames omitted

Support for baselineOnMigrate

I've got such exception:

play.api.UnexpectedException: Unexpected exception[BeanCreationException: Error creating bean with name 'class org.flywaydb.play.PlayInitializer': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.flywaydb.play.PlayInitializer]: Constructor threw exception; nested exception is org.flywaydb.core.api.FlywayException: Found non-empty schema(s) "public" without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table.]
        at play.core.server.DevServerStart$$anon$1.reload(DevServerStart.scala:186)
        at play.core.server.DevServerStart$$anon$1.get(DevServerStart.scala:124)
        at play.core.server.AkkaHttpServer.modelConversion(AkkaHttpServer.scala:183)
        at play.core.server.AkkaHttpServer.handleRequest(AkkaHttpServer.scala:189)
        at play.core.server.AkkaHttpServer.$anonfun$createServerBinding$3(AkkaHttpServer.scala:106)
        at akka.stream.impl.fusing.MapAsync$$anon$23.onPush(Ops.scala:1172)
        at akka.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:499)
        at akka.stream.impl.fusing.GraphInterpreter.processEvent(GraphInterpreter.scala:462)
        at akka.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:368)
        at akka.stream.impl.fusing.GraphInterpreterShell.runBatch(ActorGraphInterpreter.scala:571)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'class org.flywaydb.play.PlayInitializer': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.flywaydb.play.PlayInitializer]: Constructor threw exception; nested exception is org.flywaydb.core.api.FlywayException: Found non-empty schema(s) "public" without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table.
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:279)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.flywaydb.play.PlayInitializer]: Constructor threw exception; nested exception is org.flywaydb.core.api.FlywayException: Found non-empty schema(s) "public" without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table.
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:122)
        at org.springframework.beans.factory.support.ConstructorResolver$1.run(ConstructorResolver.java:265)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:262)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s) "public" without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table.
        at org.flywaydb.core.Flyway$1.execute(Flyway.java:995)
        at org.flywaydb.core.Flyway$1.execute(Flyway.java:971)
        at org.flywaydb.core.Flyway.execute(Flyway.java:1464)
        at org.flywaydb.core.Flyway.migrate(Flyway.java:971)
        at org.flywaydb.play.PlayInitializer.$anonfun$migrateAutomatically$1(PlayInitializer.scala:156)
        at org.flywaydb.play.PlayInitializer.$anonfun$migrateAutomatically$1$adapted(PlayInitializer.scala:155)
        at scala.Option.foreach(Option.scala:257)
        at org.flywaydb.play.PlayInitializer.migrateAutomatically(PlayInitializer.scala:155)
        at org.flywaydb.play.PlayInitializer.$anonfun$onStart$1(PlayInitializer.scala:147)
        at org.flywaydb.play.PlayInitializer.$anonfun$onStart$1$adapted(PlayInitializer.scala:145)

although I set db.default.migration.baselineOnMigrate=true - it seems not working

Flyway 5.2.x (broken)

I hit the following issues:

  1. Runtime error due to org.flywaydb.core.internal.util.jdbc.DriverDataSource being renamed to org.flywaydb.core.internal.jdbc.DriverDataSource ("util" removed from FQN)
  2. Runtime warning that using the Flyway constructor and mutators is deprecated; instead use the Flyway.configure fluent builder.

Support compile-time DI

The best practice to ease compile-time DI is to provide a trait named after the name of your module and ending with Components and providing a lazy val instantiating the module.

Release for Play 2.4-RC2

Great to see this plugin here.

Now that Play 2.4 has reached RC2, is it possible to have a release of this.
Would prefer to test a non-snapshot version.

Thanks again for this wonderful stuff

Play doesn't retry to establish failed database connection when starting

Steps to reproduce:

  1. Have database server off/inaccessible.
  2. Launch app
  3. When connecting, the following error will be shown:

image

(FlywaySqlException: Unable to obtain connection from database ...)
  1. Turn database on
  2. Refresh page / wait for a long time - the same error persists.

If flyway isn't enabled, the app will successfully reconnect to the database once it comes online.
Is there some setting I should use to tell flyway to attempt to reconnect ever so often?

Using flyway-play 5.0.0, Play 2.6.18. Tried both of these configurations:

db {
  nevos {
    url = "jdbc:postgresql://localhost:5432/nevos"
    user = "admin"
    password = "smth"
    driver = org.postgresql.Driver
    connectionPool = disabled
    keepAliveConnection = true
  }
}

or with dedicated connection pool:

db {
  nevos {
    url = "jdbc:postgresql://localhost:5432/nevos"
    user = "admin"
    password = "smth"
    driver = org.postgresql.Driver
    pool = hikaricp
    keepAliveConnection = true
    hikaricp {
      initializationFailTimeout = -1
      allowPoolSuspension = true
    }
  }
}

Anyone been able to connect to aws rds instance?

I set up a postgres instance on AWS and wanted to test connecting to that vs. my localhost which is running fine. It definitely connects, I see on the aws console there are connections to the database, but the app just hangs on: "[debug] - application - Directory for migration files found. db/migration/default" and never actually does the migrations. Has anyone encountered this and knows of what the issue is?

FileNotFoundException when using locations with manual migration

Hello,

we are using flyway-play with the following configuration in "development mode" (e.g. sbt run):

db.default.migrations.locations=["prod", "stage"]
db.default.migrations.auto=false

Unfortunately flyway-play crashes with a FileNotFoundException in this scenario (stacktrace) when pending migrations exist. Note that the crash does not occur when

  • we run our unit tests against the database (e.g. Mode.Test),
  • when we enable db.default.migrations.auto=true,
  • when we do not use locations at all,
  • or when all migrations are successfully applied.

I think the root cause is that PlayInitializer.migrationDescriptionToShow does not take locations into account when trying to read the migration file for the message. Hence the error only occurs when the migrations are not applied automatically because checkState and thus migrationDescriptionToShow are never invoked in this case, or when there are no pending migrations because in this case checkState doesn't call migrationDescriptionToShow.

html views are not shown in Play!-Framework 2.8 with version 7.2.0

We used successfully flyway-play throught a lot of projects written in Play!-Framework versions 2.3 up to 2.6. With the newest version 2.8, th module does not seem to work properly:

  • in dev mode, if there is a migration to be applied, the usual html-view is not shown. Instead, an internal server error is returned as in prod mode. One can fix this by manually navigation to http://localhost:9000/@flyway and applying the script

Is there a way to resolve this?

Play 2.4 RC3 testing fails due to Wrong user name or password

Hello, currently I try flyway-play with Play 2.4 RC3.
However I have a test suite that has a FakeApplication with the following code:

new WithApplication(application)

Whereas application is as following:

  def stubApplication = new GuiceApplicationBuilder()
    .in(Mode.Test)
    .configure(Map("play.evolutions.autoApply" -> "true"))
    .configure(inMemoryDatabase("default", Map("MODE" -> "PostgreSQL", "DB_CLOSE_DELAY" -> "-1")))

  def application = stubApplication
    .overrides(bind[TemplateRepository].toInstance(templateRepository))
    .overrides(bind[DocumentRepository].toInstance(documentRepository))
    .in(Mode.Test)
    .build()

However the test will fail hard with the following:

[error]   CAUSED BY org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource (jdbc:h2:mem:play-test--2066132676;MODE=PostgreSQL) for user 'null': Falscher Benutzer Name oder Passwort
[error] Wrong user name or password [28000-187]

I think flyway always wants to have a username and a password which doesnt apply to h2

Edit: It also seems that flyway ignores my username password settings inside the main play app.
I mean he ignore's db.default.username and db.default.password
I can work around it by adding the username and password to the database url, still dumb

More Information:
However I tested Specs2 and ScalaTests, both of them won't play nicely with the new behaviors.

Mostly I pass my def application to my tests either via WithApplication under Specs2 or with new App under ScalaTests while having a suite with MixedFixtures

Stacktrace:

schmitch@SHANGHAI:~/projects/envisia/loki-play$ sbt test
[info] Loading project definition from /Users/schmitch/projects/envisia/loki-play/project
[info] Set current project to loki-play (in build file:/Users/schmitch/projects/envisia/loki-play/)
[info] application - Creating Pool for datasource 'default'
[debug] application - Directory for migration files found. db/migration/default
[error] Uncaught exception when running envisia.loki.DocumentMockitoSpec: com.google.inject.CreationException: Unable to create injector, see the following errors:
[error] 
[error] 1) Error injecting constructor, org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource (jdbc:h2:mem:play-test-56005569;MODE=PostgreSQL;DB_CLOSE_DELAY=-1) for user 'null': Falscher Benutzer Name oder Passwort
[error] Wrong user name or password [28000-187]
[error]   at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:31)
[error]   at org.flywaydb.play.PlayModule.bindings(PlayModule.scala:24):
[error] Binding(class org.flywaydb.play.PlayInitializer to self eagerly) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
[error]   while locating org.flywaydb.play.PlayInitializer
[error] 
[error] 1 error
[info] application - Creating Pool for datasource 'default'
[debug] application - Directory for migration files found. db/migration/default
sbt.ForkMain$ForkError: Unable to create injector, see the following errors:

1) Error injecting constructor, org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource (jdbc:h2:mem:play-test-56005569;MODE=PostgreSQL;DB_CLOSE_DELAY=-1) for user 'null': Falscher Benutzer Name oder Passwort
Wrong user name or password [28000-187]
  at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:31)
  at org.flywaydb.play.PlayModule.bindings(PlayModule.scala:24):
Binding(class org.flywaydb.play.PlayInitializer to self eagerly) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
  while locating org.flywaydb.play.PlayInitializer

1 error
    at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:466)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
    at com.google.inject.Guice.createInjector(Guice.java:96)
    at com.google.inject.Guice.createInjector(Guice.java:73)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93)
    at envisia.loki.DocumentMockitoSpec.application(DocumentMockitoSpec.scala:34)
    at envisia.loki.DocumentMockitoSpec$$anonfun$1$$anon$1.<init>(DocumentMockitoSpec.scala:41)
    at envisia.loki.DocumentMockitoSpec$$anonfun$1.apply$mcV$sp(DocumentMockitoSpec.scala:41)
    at org.scalatest.SuperEngine.registerNestedBranch(Engine.scala:613)
    at org.scalatest.fixture.WordSpecLike$class.org$scalatest$fixture$WordSpecLike$$registerBranch(WordSpecLike.scala:155)
    at org.scalatest.fixture.WordSpecLike$$anon$1.apply(WordSpecLike.scala:1011)
    at org.scalatest.words.ShouldVerb$StringShouldWrapperForVerb$class.should(ShouldVerb.scala:192)
    at org.scalatest.Matchers$StringShouldWrapper.should(Matchers.scala:6946)
    at envisia.loki.DocumentMockitoSpec.<init>(DocumentMockitoSpec.scala:40)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:641)
    at sbt.ForkMain$Run$2.call(ForkMain.java:294)
    at sbt.ForkMain$Run$2.call(ForkMain.java:284)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: sbt.ForkMain$ForkError: Unable to obtain Jdbc connection from DataSource (jdbc:h2:mem:play-test-56005569;MODE=PostgreSQL;DB_CLOSE_DELAY=-1) for user 'null': Falscher Benutzer Name oder Passwort
Wrong user name or password [28000-187]
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnectionFromDriver(DriverDataSource.java:298)
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnection(DriverDataSource.java:257)
    at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:50)
    at org.flywaydb.core.Flyway.execute(Flyway.java:1287)
    at org.flywaydb.core.Flyway.migrate(Flyway.java:919)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:125)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:124)
    at scala.Option.foreach(Option.scala:257)
    at org.flywaydb.play.PlayInitializer.org$flywaydb$play$PlayInitializer$$migrateAutomatically(PlayInitializer.scala:124)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:116)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:114)
    at scala.collection.Iterator$class.foreach(Iterator.scala:750)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1202)
    at scala.collection.MapLike$DefaultKeySet.foreach(MapLike.scala:174)
    at org.flywaydb.play.PlayInitializer.onStart(PlayInitializer.scala:114)
    at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:133)
    at org.flywaydb.play.PlayInitializer$$FastClassByGuice$$fd53e8fe.newInstance(<generated>)
    at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
    at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:105)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:145)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
    at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
    at com.google.inject.Guice.createInjector(Guice.java:96)
    at com.google.inject.Guice.createInjector(Guice.java:73)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93)
    at envisia.loki.DocumentMockitoSpec.application(DocumentMockitoSpec.scala:34)
    at envisia.loki.DocumentMockitoSpec$$anonfun$1$$anon$1.<init>(DocumentMockitoSpec.scala:41)
    at envisia.loki.DocumentMockitoSpec$$anonfun$1.apply$mcV$sp(DocumentMockitoSpec.scala:41)
    at org.scalatest.SuperEngine.registerNestedBranch(Engine.scala:613)
    at org.scalatest.fixture.WordSpecLike$class.org$scalatest$fixture$WordSpecLike$$registerBranch(WordSpecLike.scala:155)
    at org.scalatest.fixture.WordSpecLike$$anon$1.apply(WordSpecLike.scala:1011)
    at org.scalatest.words.ShouldVerb$StringShouldWrapperForVerb$class.should(ShouldVerb.scala:192)
    at org.scalatest.Matchers$StringShouldWrapper.should(Matchers.scala:6946)
    at envisia.loki.DocumentMockitoSpec.<init>(DocumentMockitoSpec.scala:40)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:641)
    at sbt.ForkMain$Run$2.call(ForkMain.java:294)
    at sbt.ForkMain$Run$2.call(ForkMain.java:284)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: sbt.ForkMain$ForkError: Falscher Benutzer Name oder Passwort
Wrong user name or password [28000-187]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:179)
    at org.h2.message.DbException.get(DbException.java:155)
    at org.h2.message.DbException.get(DbException.java:144)
    at org.h2.engine.Engine.validateUserAndPassword(Engine.java:319)
    at org.h2.engine.Engine.createSessionAndValidate(Engine.java:153)
    at org.h2.engine.Engine.createSession(Engine.java:128)
    at org.h2.engine.Engine.createSession(Engine.java:26)
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:347)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:108)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:92)
    at org.h2.Driver.connect(Driver.java:72)
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnectionFromDriver(DriverDataSource.java:295)
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnection(DriverDataSource.java:257)
    at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:50)
    at org.flywaydb.core.Flyway.execute(Flyway.java:1287)
    at org.flywaydb.core.Flyway.migrate(Flyway.java:919)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:125)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:124)
    at scala.Option.foreach(Option.scala:257)
    at org.flywaydb.play.PlayInitializer.org$flywaydb$play$PlayInitializer$$migrateAutomatically(PlayInitializer.scala:124)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:116)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:114)
    at scala.collection.Iterator$class.foreach(Iterator.scala:750)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1202)
    at scala.collection.MapLike$DefaultKeySet.foreach(MapLike.scala:174)
    at org.flywaydb.play.PlayInitializer.onStart(PlayInitializer.scala:114)
    at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:133)
    at org.flywaydb.play.PlayInitializer$$FastClassByGuice$$fd53e8fe.newInstance(<generated>)
    at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
    at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:105)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:145)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
    at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
    at com.google.inject.Guice.createInjector(Guice.java:96)
    at com.google.inject.Guice.createInjector(Guice.java:73)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93)
    at envisia.loki.DocumentMockitoSpec.application(DocumentMockitoSpec.scala:34)
    at envisia.loki.DocumentMockitoSpec$$anonfun$1$$anon$1.<init>(DocumentMockitoSpec.scala:41)
    at envisia.loki.DocumentMockitoSpec$$anonfun$1.apply$mcV$sp(DocumentMockitoSpec.scala:41)
    at org.scalatest.SuperEngine.registerNestedBranch(Engine.scala:613)
    at org.scalatest.fixture.WordSpecLike$class.org$scalatest$fixture$WordSpecLike$$registerBranch(WordSpecLike.scala:155)
    at org.scalatest.fixture.WordSpecLike$$anon$1.apply(WordSpecLike.scala:1011)
    at org.scalatest.words.ShouldVerb$StringShouldWrapperForVerb$class.should(ShouldVerb.scala:192)
    at org.scalatest.Matchers$StringShouldWrapper.should(Matchers.scala:6946)
    at envisia.loki.DocumentMockitoSpec.<init>(DocumentMockitoSpec.scala:40)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:641)
    at sbt.ForkMain$Run$2.call(ForkMain.java:294)
    at sbt.ForkMain$Run$2.call(ForkMain.java:284)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
[error] Uncaught exception when running envisia.loki.TemplateDatabaseSpec: com.google.inject.CreationException: Unable to create injector, see the following errors:
[error] 
[error] 1) Error injecting constructor, org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource (jdbc:h2:mem:play-test--948704778;MODE=PostgreSQL;DB_CLOSE_DELAY=-1) for user 'null': Falscher Benutzer Name oder Passwort
[error] Wrong user name or password [28000-187]
[error]   at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:31)
[error]   at org.flywaydb.play.PlayModule.bindings(PlayModule.scala:24):
[error] Binding(class org.flywaydb.play.PlayInitializer to self eagerly) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
[error]   while locating org.flywaydb.play.PlayInitializer
[error] 
[error] 1 error
[info] application - Creating Pool for datasource 'default'
[debug] application - Directory for migration files found. db/migration/default
sbt.ForkMain$ForkError: Unable to create injector, see the following errors:

1) Error injecting constructor, org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource (jdbc:h2:mem:play-test--948704778;MODE=PostgreSQL;DB_CLOSE_DELAY=-1) for user 'null': Falscher Benutzer Name oder Passwort
Wrong user name or password [28000-187]
  at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:31)
  at org.flywaydb.play.PlayModule.bindings(PlayModule.scala:24):
Binding(class org.flywaydb.play.PlayInitializer to self eagerly) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
  while locating org.flywaydb.play.PlayInitializer

1 error
    at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:466)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
    at com.google.inject.Guice.createInjector(Guice.java:96)
    at com.google.inject.Guice.createInjector(Guice.java:73)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93)
    at envisia.loki.TemplateDatabaseSpec.application(TemplateDatabaseSpec.scala:25)
    at envisia.loki.TemplateDatabaseSpec$$anonfun$1$$anon$1.<init>(TemplateDatabaseSpec.scala:29)
    at envisia.loki.TemplateDatabaseSpec$$anonfun$1.apply$mcV$sp(TemplateDatabaseSpec.scala:29)
    at org.scalatest.SuperEngine.registerNestedBranch(Engine.scala:613)
    at org.scalatest.fixture.WordSpecLike$class.org$scalatest$fixture$WordSpecLike$$registerBranch(WordSpecLike.scala:155)
    at org.scalatest.fixture.WordSpecLike$$anon$1.apply(WordSpecLike.scala:1011)
    at org.scalatest.words.ShouldVerb$StringShouldWrapperForVerb$class.should(ShouldVerb.scala:192)
    at org.scalatest.Matchers$StringShouldWrapper.should(Matchers.scala:6946)
    at envisia.loki.TemplateDatabaseSpec.<init>(TemplateDatabaseSpec.scala:27)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:641)
    at sbt.ForkMain$Run$2.call(ForkMain.java:294)
    at sbt.ForkMain$Run$2.call(ForkMain.java:284)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: sbt.ForkMain$ForkError: Unable to obtain Jdbc connection from DataSource (jdbc:h2:mem:play-test--948704778;MODE=PostgreSQL;DB_CLOSE_DELAY=-1) for user 'null': Falscher Benutzer Name oder Passwort
Wrong user name or password [28000-187]
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnectionFromDriver(DriverDataSource.java:298)
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnection(DriverDataSource.java:257)
    at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:50)
    at org.flywaydb.core.Flyway.execute(Flyway.java:1287)
    at org.flywaydb.core.Flyway.migrate(Flyway.java:919)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:125)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:124)
    at scala.Option.foreach(Option.scala:257)
    at org.flywaydb.play.PlayInitializer.org$flywaydb$play$PlayInitializer$$migrateAutomatically(PlayInitializer.scala:124)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:116)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:114)
    at scala.collection.Iterator$class.foreach(Iterator.scala:750)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1202)
    at scala.collection.MapLike$DefaultKeySet.foreach(MapLike.scala:174)
    at org.flywaydb.play.PlayInitializer.onStart(PlayInitializer.scala:114)
    at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:133)
    at org.flywaydb.play.PlayInitializer$$FastClassByGuice$$fd53e8fe.newInstance(<generated>)
    at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
    at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:105)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:145)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
    at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
    at com.google.inject.Guice.createInjector(Guice.java:96)
    at com.google.inject.Guice.createInjector(Guice.java:73)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93)
    at envisia.loki.TemplateDatabaseSpec.application(TemplateDatabaseSpec.scala:25)
    at envisia.loki.TemplateDatabaseSpec$$anonfun$1$$anon$1.<init>(TemplateDatabaseSpec.scala:29)
    at envisia.loki.TemplateDatabaseSpec$$anonfun$1.apply$mcV$sp(TemplateDatabaseSpec.scala:29)
    at org.scalatest.SuperEngine.registerNestedBranch(Engine.scala:613)
    at org.scalatest.fixture.WordSpecLike$class.org$scalatest$fixture$WordSpecLike$$registerBranch(WordSpecLike.scala:155)
    at org.scalatest.fixture.WordSpecLike$$anon$1.apply(WordSpecLike.scala:1011)
    at org.scalatest.words.ShouldVerb$StringShouldWrapperForVerb$class.should(ShouldVerb.scala:192)
    at org.scalatest.Matchers$StringShouldWrapper.should(Matchers.scala:6946)
    at envisia.loki.TemplateDatabaseSpec.<init>(TemplateDatabaseSpec.scala:27)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:641)
    at sbt.ForkMain$Run$2.call(ForkMain.java:294)
    at sbt.ForkMain$Run$2.call(ForkMain.java:284)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: sbt.ForkMain$ForkError: Falscher Benutzer Name oder Passwort
Wrong user name or password [28000-187]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:179)
    at org.h2.message.DbException.get(DbException.java:155)
    at org.h2.message.DbException.get(DbException.java:144)
    at org.h2.engine.Engine.validateUserAndPassword(Engine.java:319)
    at org.h2.engine.Engine.createSessionAndValidate(Engine.java:153)
    at org.h2.engine.Engine.createSession(Engine.java:128)
    at org.h2.engine.Engine.createSession(Engine.java:26)
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:347)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:108)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:92)
    at org.h2.Driver.connect(Driver.java:72)
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnectionFromDriver(DriverDataSource.java:295)
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnection(DriverDataSource.java:257)
    at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:50)
    at org.flywaydb.core.Flyway.execute(Flyway.java:1287)
    at org.flywaydb.core.Flyway.migrate(Flyway.java:919)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:125)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:124)
    at scala.Option.foreach(Option.scala:257)
    at org.flywaydb.play.PlayInitializer.org$flywaydb$play$PlayInitializer$$migrateAutomatically(PlayInitializer.scala:124)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:116)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:114)
    at scala.collection.Iterator$class.foreach(Iterator.scala:750)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1202)
    at scala.collection.MapLike$DefaultKeySet.foreach(MapLike.scala:174)
    at org.flywaydb.play.PlayInitializer.onStart(PlayInitializer.scala:114)
    at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:133)
    at org.flywaydb.play.PlayInitializer$$FastClassByGuice$$fd53e8fe.newInstance(<generated>)
    at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
    at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:105)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:145)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
    at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
    at com.google.inject.Guice.createInjector(Guice.java:96)
    at com.google.inject.Guice.createInjector(Guice.java:73)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93)
    at envisia.loki.TemplateDatabaseSpec.application(TemplateDatabaseSpec.scala:25)
    at envisia.loki.TemplateDatabaseSpec$$anonfun$1$$anon$1.<init>(TemplateDatabaseSpec.scala:29)
    at envisia.loki.TemplateDatabaseSpec$$anonfun$1.apply$mcV$sp(TemplateDatabaseSpec.scala:29)
    at org.scalatest.SuperEngine.registerNestedBranch(Engine.scala:613)
    at org.scalatest.fixture.WordSpecLike$class.org$scalatest$fixture$WordSpecLike$$registerBranch(WordSpecLike.scala:155)
    at org.scalatest.fixture.WordSpecLike$$anon$1.apply(WordSpecLike.scala:1011)
    at org.scalatest.words.ShouldVerb$StringShouldWrapperForVerb$class.should(ShouldVerb.scala:192)
    at org.scalatest.Matchers$StringShouldWrapper.should(Matchers.scala:6946)
    at envisia.loki.TemplateDatabaseSpec.<init>(TemplateDatabaseSpec.scala:27)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:641)
    at sbt.ForkMain$Run$2.call(ForkMain.java:294)
    at sbt.ForkMain$Run$2.call(ForkMain.java:284)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
[error] Uncaught exception when running envisia.loki.TemplateMockitoSpec: com.google.inject.CreationException: Unable to create injector, see the following errors:
[error] 
[error] 1) Error injecting constructor, org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource (jdbc:h2:mem:play-test-404376192;MODE=PostgreSQL;DB_CLOSE_DELAY=-1) for user 'null': Falscher Benutzer Name oder Passwort
[error] Wrong user name or password [28000-187]
[error]   at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:31)
[error]   at org.flywaydb.play.PlayModule.bindings(PlayModule.scala:24):
[error] Binding(class org.flywaydb.play.PlayInitializer to self eagerly) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
[error]   while locating org.flywaydb.play.PlayInitializer
[error] 
[error] 1 error
sbt.ForkMain$ForkError: Unable to create injector, see the following errors:

1) Error injecting constructor, org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource (jdbc:h2:mem:play-test-404376192;MODE=PostgreSQL;DB_CLOSE_DELAY=-1) for user 'null': Falscher Benutzer Name oder Passwort
Wrong user name or password [28000-187]
  at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:31)
  at org.flywaydb.play.PlayModule.bindings(PlayModule.scala:24):
Binding(class org.flywaydb.play.PlayInitializer to self eagerly) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
  while locating org.flywaydb.play.PlayInitializer

1 error
    at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:466)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
    at com.google.inject.Guice.createInjector(Guice.java:96)
    at com.google.inject.Guice.createInjector(Guice.java:73)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93)
    at envisia.loki.TemplateMockitoSpec.application(TemplateMockitoSpec.scala:31)
    at envisia.loki.TemplateMockitoSpec$$anonfun$1$$anon$1.<init>(TemplateMockitoSpec.scala:46)
    at envisia.loki.TemplateMockitoSpec$$anonfun$1.apply$mcV$sp(TemplateMockitoSpec.scala:46)
    at org.scalatest.SuperEngine.registerNestedBranch(Engine.scala:613)
    at org.scalatest.fixture.WordSpecLike$class.org$scalatest$fixture$WordSpecLike$$registerBranch(WordSpecLike.scala:155)
    at org.scalatest.fixture.WordSpecLike$$anon$1.apply(WordSpecLike.scala:1011)
    at org.scalatest.words.ShouldVerb$StringShouldWrapperForVerb$class.should(ShouldVerb.scala:192)
    at org.scalatest.Matchers$StringShouldWrapper.should(Matchers.scala:6946)
    at envisia.loki.TemplateMockitoSpec.<init>(TemplateMockitoSpec.scala:45)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:641)
    at sbt.ForkMain$Run$2.call(ForkMain.java:294)
    at sbt.ForkMain$Run$2.call(ForkMain.java:284)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: sbt.ForkMain$ForkError: Unable to obtain Jdbc connection from DataSource (jdbc:h2:mem:play-test-404376192;MODE=PostgreSQL;DB_CLOSE_DELAY=-1) for user 'null': Falscher Benutzer Name oder Passwort
Wrong user name or password [28000-187]
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnectionFromDriver(DriverDataSource.java:298)
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnection(DriverDataSource.java:257)
    at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:50)
    at org.flywaydb.core.Flyway.execute(Flyway.java:1287)
    at org.flywaydb.core.Flyway.migrate(Flyway.java:919)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:125)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:124)
    at scala.Option.foreach(Option.scala:257)
    at org.flywaydb.play.PlayInitializer.org$flywaydb$play$PlayInitializer$$migrateAutomatically(PlayInitializer.scala:124)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:116)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:114)
    at scala.collection.Iterator$class.foreach(Iterator.scala:750)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1202)
    at scala.collection.MapLike$DefaultKeySet.foreach(MapLike.scala:174)
    at org.flywaydb.play.PlayInitializer.onStart(PlayInitializer.scala:114)
    at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:133)
    at org.flywaydb.play.PlayInitializer$$FastClassByGuice$$fd53e8fe.newInstance(<generated>)
    at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
    at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:105)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:145)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
    at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
    at com.google.inject.Guice.createInjector(Guice.java:96)
    at com.google.inject.Guice.createInjector(Guice.java:73)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93)
    at envisia.loki.TemplateMockitoSpec.application(TemplateMockitoSpec.scala:31)
    at envisia.loki.TemplateMockitoSpec$$anonfun$1$$anon$1.<init>(TemplateMockitoSpec.scala:46)
    at envisia.loki.TemplateMockitoSpec$$anonfun$1.apply$mcV$sp(TemplateMockitoSpec.scala:46)
    at org.scalatest.SuperEngine.registerNestedBranch(Engine.scala:613)
    at org.scalatest.fixture.WordSpecLike$class.org$scalatest$fixture$WordSpecLike$$registerBranch(WordSpecLike.scala:155)
    at org.scalatest.fixture.WordSpecLike$$anon$1.apply(WordSpecLike.scala:1011)
    at org.scalatest.words.ShouldVerb$StringShouldWrapperForVerb$class.should(ShouldVerb.scala:192)
    at org.scalatest.Matchers$StringShouldWrapper.should(Matchers.scala:6946)
    at envisia.loki.TemplateMockitoSpec.<init>(TemplateMockitoSpec.scala:45)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:641)
    at sbt.ForkMain$Run$2.call(ForkMain.java:294)
    at sbt.ForkMain$Run$2.call(ForkMain.java:284)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: sbt.ForkMain$ForkError: Falscher Benutzer Name oder Passwort
Wrong user name or password [28000-187]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:179)
    at org.h2.message.DbException.get(DbException.java:155)
    at org.h2.message.DbException.get(DbException.java:144)
    at org.h2.engine.Engine.validateUserAndPassword(Engine.java:319)
    at org.h2.engine.Engine.createSessionAndValidate(Engine.java:153)
    at org.h2.engine.Engine.createSession(Engine.java:128)
    at org.h2.engine.Engine.createSession(Engine.java:26)
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:347)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:108)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:92)
    at org.h2.Driver.connect(Driver.java:72)
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnectionFromDriver(DriverDataSource.java:295)
    at org.flywaydb.core.internal.util.jdbc.DriverDataSource.getConnection(DriverDataSource.java:257)
    at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:50)
    at org.flywaydb.core.Flyway.execute(Flyway.java:1287)
    at org.flywaydb.core.Flyway.migrate(Flyway.java:919)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:125)
    at org.flywaydb.play.PlayInitializer$$anonfun$org$flywaydb$play$PlayInitializer$$migrateAutomatically$1.apply(PlayInitializer.scala:124)
    at scala.Option.foreach(Option.scala:257)
    at org.flywaydb.play.PlayInitializer.org$flywaydb$play$PlayInitializer$$migrateAutomatically(PlayInitializer.scala:124)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:116)
    at org.flywaydb.play.PlayInitializer$$anonfun$onStart$1.apply(PlayInitializer.scala:114)
    at scala.collection.Iterator$class.foreach(Iterator.scala:750)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1202)
    at scala.collection.MapLike$DefaultKeySet.foreach(MapLike.scala:174)
    at org.flywaydb.play.PlayInitializer.onStart(PlayInitializer.scala:114)
    at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:133)
    at org.flywaydb.play.PlayInitializer$$FastClassByGuice$$fd53e8fe.newInstance(<generated>)
    at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
    at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:105)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:145)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
    at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
    at com.google.inject.Guice.createInjector(Guice.java:96)
    at com.google.inject.Guice.createInjector(Guice.java:73)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126)
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93)
    at envisia.loki.TemplateMockitoSpec.application(TemplateMockitoSpec.scala:31)
    at envisia.loki.TemplateMockitoSpec$$anonfun$1$$anon$1.<init>(TemplateMockitoSpec.scala:46)
    at envisia.loki.TemplateMockitoSpec$$anonfun$1.apply$mcV$sp(TemplateMockitoSpec.scala:46)
    at org.scalatest.SuperEngine.registerNestedBranch(Engine.scala:613)
    at org.scalatest.fixture.WordSpecLike$class.org$scalatest$fixture$WordSpecLike$$registerBranch(WordSpecLike.scala:155)
    at org.scalatest.fixture.WordSpecLike$$anon$1.apply(WordSpecLike.scala:1011)
    at org.scalatest.words.ShouldVerb$StringShouldWrapperForVerb$class.should(ShouldVerb.scala:192)
    at org.scalatest.Matchers$StringShouldWrapper.should(Matchers.scala:6946)
    at envisia.loki.TemplateMockitoSpec.<init>(TemplateMockitoSpec.scala:45)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:641)
    at sbt.ForkMain$Run$2.call(ForkMain.java:294)
    at sbt.ForkMain$Run$2.call(ForkMain.java:284)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
[info] ScalaTest
[info] Run completed in 5 seconds, 97 milliseconds.
[info] Total number of tests run: 0
[info] Suites: completed 0, aborted 0
[info] Tests: succeeded 0, failed 0, canceled 0, ignored 0, pending 0
[info] No tests were executed.
[error] Error: Total 3, Failed 0, Errors 3, Passed 0
[error] Error during tests:
[error]     envisia.loki.TemplateDatabaseSpec
[error]     envisia.loki.TemplateMockitoSpec
[error]     envisia.loki.DocumentMockitoSpec
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 6 s, completed 22.05.2015 15:59:18

flyway.ignoreMissingMigrations does not seem to work on 4.0 or 5.2.

Added db.default.migration.ignoreMissingMigrations=true with no effect.
I checked PlayInitializer.scala and it seems to map only few of the many flyway properties.

Is there another way of setting this configuration?
I added flyway.conf to my resources folder with this config but did not help.

Travis CI

@axelfontaine
I want to set up Travis CI but have no permission to change repository settings.
Could you give me the permission?

EagerSingleton modules are started before Flyway finish running migrations

I use flyway-play version 3.2.0 with Play Framework version 2.5.15.

In my application, I have a module called ApplicationStart:

bind(ApplicationStart.class).asEagerSingleton();

In this ApplicationStart, I have many cleanup tasks that use the database.

Unfortunately, it seems that eagerSingletons modules are started BEFORE all the scripts from Flyway migrations are run. This means that sometimes, if a table is needed but not yet created, we get injection errors that a table is missing.

Is there any callback from the flyway plugin that I could use to know for sure that the migrations are completed and that I can safely run cleanup task at startup.

NoSuchMethodError after upgrading from flyway 4.0.3 to 4.1.2

I am using flyway-play 3.0.1 (with play framework 2.5.7) and getting the following exception on startup after upgrading flyway from 4.0.3 to 4.1.2. Getting same error on flyway 4.1.0.

play.api.UnexpectedException: Unexpected exception[CreationException: Unable to create injector, see the following errors:

1) Error injecting constructor, java.lang.NoSuchMethodError: org.flywaydb.core.internal.util.jdbc.DriverDataSource.<init>(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
  at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:31)
  at org.flywaydb.play.PlayModule.bindings(PlayModule.scala:24):
Binding(class org.flywaydb.play.PlayInitializer to self eagerly) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
  while locating org.flywaydb.play.PlayInitializer

1 error]
	at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:180)
	at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:131)
	at scala.Option.map(Option.scala:146)
	at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:131)
	at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:129)
	at scala.util.Success.flatMap(Try.scala:231)
	at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:129)
	at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:121)
	at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
	at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: com.google.inject.CreationException: Unable to create injector, see the following errors:

1) Error injecting constructor, java.lang.NoSuchMethodError: org.flywaydb.core.internal.util.jdbc.DriverDataSource.<init>(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
  at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:31)
  at org.flywaydb.play.PlayModule.bindings(PlayModule.scala:24):
Binding(class org.flywaydb.play.PlayInitializer to self eagerly) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
  while locating org.flywaydb.play.PlayInitializer

1 error
	at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:466)
	at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
	at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
	at com.google.inject.Guice.createInjector(Guice.java:96)
	at com.google.inject.Guice.createInjector(Guice.java:84)
	at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:181)
	at play.inject.guice.GuiceBuilder.injector(GuiceBuilder.java:208)
	at play.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.java:127)
	at play.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.java:34)
	at play.api.ApplicationLoader$JavaApplicationLoaderAdapter$1.load(ApplicationLoader.scala:70)
	at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:168)
	at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:164)
	at play.utils.Threads$.withContextClassLoader(Threads.scala:21)
	at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:164)
	... 14 common frames omitted
Caused by: java.lang.NoSuchMethodError: org.flywaydb.core.internal.util.jdbc.DriverDataSource.<init>(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
	at org.flywaydb.play.PlayInitializer$$anonfun$flyways$4.apply(PlayInitializer.scala:65)
	at org.flywaydb.play.PlayInitializer$$anonfun$flyways$4.apply(PlayInitializer.scala:59)
	at scala.collection.TraversableLike$WithFilter$$anonfun$map$2.apply(TraversableLike.scala:683)
	at scala.collection.immutable.Map$Map2.foreach(Map.scala:137)
	at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:682)
	at org.flywaydb.play.PlayInitializer.flyways$lzycompute(PlayInitializer.scala:59)
	at org.flywaydb.play.PlayInitializer.flyways(PlayInitializer.scala:57)
	at org.flywaydb.play.PlayInitializer.onStart(PlayInitializer.scala:128)
	at org.flywaydb.play.PlayInitializer.<init>(PlayInitializer.scala:150)
	at org.flywaydb.play.PlayInitializer$$FastClassByGuice$$fd53e8fe.newInstance(<generated>)
	at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
	at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61)
	at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:105)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
	at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:145)
	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
	at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:205)
	at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:199)
	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
	at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:199)
	at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:180)
	... 26 common frames omitted

Configuration Scanner Overzealous On Identifying Databases

I've encountered a few... explosive failures when trying to use flyway-play while configuring pools and having other extra information in the db configuration section.

The Play Configuration Reference shows that many non-db entries can be present. Throwing an exception whenever one is encountered seems extreme, and also prejudices against other libraries making use of the space.

I initially encountered this while trying to write my own play adapter for postgresql-async (which admittedly isn't correct at handling this either at the time of this writing). For its configuration I'd decided that db.asyncPool should contain information configuring the async connection pool and hoped that my lib and this one could coexist nicely.

I think ideally this module should scan, searching for valid urls and drivers, and if it finds one but not the other, consider it an error, otherwise just log that the entry was skipped. Possibly the addition of a "db.name.flyway" boolean parameter, defaulting to true would allow silencing the logs or explicitly skipping the processing of unwanted database connections.

I'm wrapped up in my own fixes right now or I'd try to submit a patch.

sql file named V1__??? does not properly get executed in prod mode

I'm kind of new to flyway so I might be misunderstanding something though,
when you use a sql file named V1,It's working perfectly in test/dev mode but flyway does not execute it in prod mode.

I guess It's great if flyway-play had an option to execute init of flyway or output warning if V1__???.sql is located in the target directory.

Am I missing something?

Update for Flyway 4

Flyway 4 has just been release, should update play-flyway to take this into account

Hack a `flywayPrefixToMigrationScript` other than `db/migration`?

Greetings! ☺️

I would like to keep my migrations in conf/schema/sql rather than in conf/db/migrations (because I also have a conf/schema/json and I want them to be parallel). Can I accomplish this with flyway-play as it stands today?

My best attempt so far is this config:

db.data.driver = org.postgresql.Driver
db.data.migration.schemas = ["myschema"]
db.data.migration.initOnMigrate = true
db.data.migration.auto = true
db.data.migration.locations = ["../../../schema/sql"]

Which gives me this log output:

2018-08-16 16:26:02 -0400 [WARN] from org.flywaydb.core.internal.util.scanner.classpath.ClassPathScanner in ForkJoinPool-1-worker-1 - Unable to resolve location classpath:db/migration/data//////////schema/sql
2018-08-16 16:26:02 -0400 [INFO] from org.flywaydb.core.internal.command.DbSchemas in ForkJoinPool-1-worker-1 - Creating schema "myschema" ...
2018-08-16 16:26:02 -0400 [INFO] from org.flywaydb.core.internal.metadatatable.MetaDataTableImpl in ForkJoinPool-1-worker-1 - Creating Metadata table: "myschema"."schema_version"
2018-08-16 16:26:02 -0400 [INFO] from org.flywaydb.core.internal.command.DbMigrate in ForkJoinPool-1-worker-1 - Current version of schema "myschema": null
2018-08-16 16:26:02 -0400 [INFO] from org.flywaydb.core.internal.command.DbMigrate in ForkJoinPool-1-worker-1 - Schema "myschema" is up to date. No migration necessary.

My hunch is that this would require some changes to flyway-play but I figured I would pose the question!

Maven "flyway-play" may require scala postfix?

I've just "fixed" a problem I was having when trying to add flyway-play to my Play instance. I had been using the following in my build.sbt as instructed:

libraryDependencies ++= Seq( "org.flywaydb" %% "flyway-play" % "6.0.0" )

However, apparently "flyway-play" is not a maven path. Instead it appears that you also need to add "_[scala version]", so for example I am using Scala 2.13 so it became:

libraryDependencies ++= Seq( "org.flywaydb" %% "flyway-play_2.13" % "6.0.0" )

Without that change, sbt was unable to build the application due to being unable to locate the library.

Add new configuration parameter - mixed

Please add the following flyway configuration parameter that allows mixing transactional and non-transactional statements within the same migration.

mixed

How to do Flyway migrations eager in Play Framework

What I want to do is to run the migration eagerly before other Components need the database.

I tried to inject the FlywayPlayComponents into my Setup, like:

    @Singleton
    class AppSetup @Inject()(val environment: Environment,
                                val webCommands: WebCommands,
                                val configuration: Configuration,
                           )
      extends FlywayPlayComponents {
    
      flywayPlayInitializer
      ...

But AppSetup is still run first and the Flyway migration is run with the first request.

Is there a way to do this or do I miss something?

I also created a Stackoverflow question:

https://stackoverflow.com/questions/60303933/how-to-do-flyway-migrations-eager-in-play-framework

Cannot override flywayUrl in different environments

I would like to be able to supply flywayUrl/user and password dependent on the environment the application is running.

The flyway command line supports arguments but I cannot find how to execute flywayMigrate with arguments.

Could you advise?

Thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.