web-dev-qa-db-fra.com

Puis-je laisser H2 créer automatiquement un schéma dans une base de données en mémoire?

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

J'aimerais savoir s'il existe un paramètre dans H2 qui me permettra de créer automatiquement un schéma lors de la connexion à celui-ci. Si cela peut aider, je ne m'intéresse qu'au cas en mémoire.

H2 prend en charge divers modificateurs séparés par des points-virgules à la fin de l'URL, mais je n'en ai trouvé aucun pour la création automatique d'un schéma. Y a-t-il une telle fonctionnalité?

79
Laird Nelson

Oui, H2 prend en charge exécution des instructions SQL lors de la connexion . Vous pouvez exécuter un script, ou juste une instruction 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 la double barre oblique inversée (\\) n'est requis que dans Java. La barre oblique inverse avant ; dans INIT est requis.

149
Thomas Mueller

Si vous utilisez spring avec application.yml, ce qui suit fonctionnera pour vous.

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

8
Marquis Blount

"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 Database .

Addendum: @Thomas Mueller montre comment Exécuter SQL lors de la connexion , mais parfois je crée et remplis 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 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);
        }
    }
}
8
trashgod

Ce que Thomas a écrit est correct. De plus, si vous souhaitez initialiser plusieurs schémas, vous pouvez utiliser ce qui suit. Notez qu'il y a un \\; séparant les deux instructions de création.

    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

7
Zeus