如何使用Dropwizard自动创建数据库

时间:2015-12-15 00:38:20

标签: hibernate postgresql dropwizard

我正在寻找一种方法,如果我的Dropwizard应用程序启动时它不存在,我可以检查并创建一个PostgreSQL数据库。我正在使用多个数据库,因此我们选择使用私有模块加载所有连接和持久性单元。我已经看过使用JDBI,但这似乎打破了我们想要使用私有模块的方法。我也读过使用Dropwizard Migrations但看起来很像xml很重,这是我想要避免的。

如果我从一个已经建立的空白数据库开始,Hibernate会很好地创建我的模式,所以我唯一缺少的部分是如果数据库不存在则会自动创建数据库。

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我必须至少拥有一个静态的连接。例如。如果您的数据库是:

jdbc:mysql://localhost:3306/X
jdbc:mysql://localhost:3306/Y

然后你必须与

建立联系
jdbc:mysql://localhost:3306/

在您的启动代码中,您需要手动检查是否存在所有数据库,如果不存在则创建它们。之后,您可以加载其余的持久性上下文。

例如,有关如何使用纯jdbc

执行此操作的快速代码段
public class DBTest {

public static DataSource datasource() { 
    MysqlDataSource ds = new MysqlDataSource();
    ds.setUrl("jdbc:mysql://localhost/?"
              + "user=root");
    return ds;
}


public static void main(String[] args) throws SQLException {

    DataSource datasource = datasource();
    ResultSet executeQuery = datasource.getConnection().createStatement().executeQuery("Show databases;");

    List<String> tables = new ArrayList<>();

    while(executeQuery.next()) {

        tables.add(executeQuery.getString(1));
    }

    if(!tables.contains("MyNewDB")) {
        datasource.getConnection().createStatement().execute("Create database MyNewDB;");
    }

}

}

编辑:

正如所指出的,上面是一个mysql解决方案。我安装了postgres并进行了快速调整,所以这对我来说适用于postgres。主要问题是,没有&#34;显示数据库&#34;对于postgres。替换它(和连接等)修复了这个问题。工作原理相同:

public static void main(String[] args) throws SQLException, ClassNotFoundException {

        Class.forName("org.postgresql.Driver");
        Connection connection = null;
        connection = DriverManager.getConnection(
           "jdbc:postgresql://localhost:5432/","artur", "");


        ResultSet executeQuery = connection.createStatement().executeQuery("SELECT datname FROM pg_database;");

        List<String> tables = new ArrayList<>();

        while(executeQuery.next()) {

            tables.add(executeQuery.getString(1));
        }



        if(!tables.contains("MyNewDB")) {
            connection.createStatement().execute("Create database MyNewDB;");
        }
        connection.close();

    }

另请注意,应正确处理jdbc部分(处理连接等)。它给出了正确的想法,我希望:)