2015-12-15 2 views
0

Я ищу способ Я могу проверить и создать базу данных PostgreSQL, если она не существует, когда мое приложение Dropwizard запускается. Я работаю с несколькими базами данных, поэтому мы выбрали загрузку всех наших подключений и блоков сохранения с частными модулями. Я посмотрел на использование JDBI, но это, похоже, нарушает подход, который мы хотим использовать с частными модулями. Я также прочитал об использовании Dropwizard Migrations, но, похоже, это довольно тяжелый xml, которого я хочу избежать.Как создать базу данных автоматически с Dropwizard

Если я начинаю с пустой базы данных, которая уже была сделана, Hibernate будет создавать мою схему просто отлично, поэтому единственная часть, которую мне не хватает, - это создание базы данных автоматически, если она не существует.

Любая помощь приветствуется!

ответ

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;"); 
    } 

} 

}

EDIT:

Как правильно указывалось, выше, является MySQL решение. Я установил postgres и сделал быструю адаптацию, поэтому это работает для меня с postgres. Основная проблема заключалась в том, что для 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 (обращение с подключением и т. Д.). Это дает правильную идею, я надеюсь :)

+0

Можете ли вы уточнить? У меня не было установки postgres и предполагалось, что с точки зрения sql она должна быть одинаковой. – pandaadb

+0

Право :) Я написал версию postgres того же кода. – pandaadb