Можно ли автоматически создать схему H2 в базе данных в памяти? - PullRequest
78 голосов
/ 08 марта 2011

(я уже видел базу данных H2 в памяти - схема Init через Spring / Hibernate вопрос; здесь она неприменима).настройка в H2, которая позволит мне автоматически создавать схему при подключении к ней.Если это помогает, меня интересует только случай в памяти.

H2 поддерживает различные разделенные точкой с запятой модификаторы в конце URL, но я не нашел ни одного для автоматического создания схемы.Есть ли такая функция?

Ответы [ 4 ]

147 голосов
/ 08 марта 2011

Да, H2 поддерживает выполнение операторов SQL при подключении .Вы можете запустить скрипт или просто оператор или два:

String url = "jdbc:h2:mem:test;" + 
             "INIT=CREATE SCHEMA IF NOT EXISTS TEST"
String url = "jdbc:h2:mem:test;" + 
             "INIT=CREATE SCHEMA IF NOT EXISTS TEST\\;" + 
                  "SET SCHEMA TEST";
String url = "jdbc:h2:mem;" + 
             "INIT=RUNSCRIPT FROM '~/create.sql'\\;" + 
                  "RUNSCRIPT FROM '~/populate.sql'";

Обратите внимание, что двойной обратный слеш (\\) требуется только в Java.Требуется обратный слеш перед ; в пределах INIT.

8 голосов
/ 29 декабря 2017

Если вы используете spring с application.yml, для вас будет работать следующее

spring: datasource: url: jdbc:h2:mem:mydb;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL;INIT=CREATE SCHEMA IF NOT EXISTS calendar

7 голосов
/ 08 марта 2011

"По умолчанию, когда приложение вызывает DriverManager.getConnection(url, ...), а база данных, указанная в URL-адресе, еще не существует, создается новая (пустая) база данных." - H2 База данных .

Приложение: @Thomas Mueller показывает, как Выполнить SQL при подключении , но я иногда просто создаю и заполняю код, как предлагается ниже.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/** @see http://stackoverflow.com/questions/5225700 */
public class H2MemTest {

    public static void main(String[] args) throws Exception {
        Connection conn = DriverManager.getConnection("jdbc:h2:mem:", "sa", "");
        Statement st = conn.createStatement();
        st.execute("create table customer(id integer, name varchar(10))");
        st.execute("insert into customer values (1, 'Thomas')");
        Statement stmt = conn.createStatement();
        ResultSet rset = stmt.executeQuery("select name from customer");
        while (rset.next()) {
            String name = rset.getString(1);
            System.out.println(name);
        }
    }
}
6 голосов
/ 06 апреля 2018

То, что написал Томас, верно, кроме того, если вы хотите инициализировать несколько схем, вы можете использовать следующее. Обратите внимание, что \\; разделяет два оператора создания.

    EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
                    .setType(EmbeddedDatabaseType.H2)
                    .setName("testDb;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;INIT=create " +
                            "schema if not exists " +
                            "schema_a\\;create schema if not exists schema_b;" +
                            "DB_CLOSE_DELAY=-1;")
                    .addScript("sql/provPlan/createTable.sql")
                    .addScript("sql/provPlan/insertData.sql")
                    .addScript("sql/provPlan/insertSpecRel.sql")
                    .build();

ref: http://www.h2database.com/html/features.html#execute_sql_on_connection

...