Puis-je avoir H2 autocréant un schéma dans une base de données en mémoire?

(j'ai déjà vu la base de données H2 en mémoire - schéma Init via Spring/Hibernate question; il n'est pas applicable ici.)

j'aimerais savoir s'il y a un paramètre dans H2 qui me permettra de créer automatiquement un schéma après la connexion. Si ça peut aider, Je ne m'intéresse qu'à la mémoire.

H2 supporte différents modificateurs séparés par un point-virgule à la fin de L'URL, mais je n'en ai pas trouvé un pour automatiquement création d'un schéma. Est-il une telle fonctionnalité?

68
demandé sur Community 2011-03-08 00:50:44

4 réponses

Oui, H2 prend en charge l'exécution des instructions SQL lors de la connexion . Vous pouvez lancer un script, ou juste une déclaration ou deux:

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'";

veuillez noter que le double antislash ( \ ) n'est requis qu'en Java. Le ou les antislash(s) avant ; dans le INIT est requis.

126
répondu Thomas Mueller 2013-07-09 08:02:49

" par défaut, lorsqu'une application appelle DriverManager.getConnection(url, ...) et que la base de données spécifiée dans L'URL n'existe pas encore, une nouvelle base de données (vide) est créée."- H2 Base De Données .

Addendum: @Thomas Mueller montre comment exécuter SQL sur la connexion , mais il m'arrive parfois de créer et de peupler dans le code, comme suggéré ci-dessous.

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

/** @see /q/can-i-have-h2-autocreate-a-schema-in-an-in-memory-database-29757/"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);
        }
    }
}
7
répondu trashgod 2011-03-08 08:28:01

si vous utilisez le ressort avec l'application.yml la suite va travailler pour vous

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

5
répondu Marquis Blount 2017-12-29 09:28:11

Ce que Thomas a écrit est correct, en plus de cela, si vous souhaitez initialiser plusieurs schémas suivants peuvent être utilisés. Remarque Il y a un \; qui sépare les deux énoncés create.

    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();

réf: http://www.h2database.com/html/features.html#execute_sql_on_connection

3
répondu Zeus 2018-04-06 15:14:37