115 votes

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

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

Je voudrais savoir si il y a un paramètre dans H2 qui va me permettre de créer automatiquement un schéma lors de la connexion. Si cela peut aider, je suis seulement intéressé dans le cas de mémoire.

H2 prend en charge divers point-virgule, séparés des modificateurs à la fin de l'URL, mais je n'ai pas à en trouver un pour créer automatiquement un schéma. Est-il une telle fonctionnalité?

210voto

Thomas Mueller Points 18666

Oui, H2 prend en charge l'exécution des instructions SQL lors de la connexion. Vous pouvez exécuter un script, ou tout simplement 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 la double barre oblique inverse (\\) est seulement nécessaire dans Java. La barre oblique inverse(es) avant d' ; dans la INIT est requis.

8voto

trashgod Points 136305

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

Addendum: @Thomas Mueller montre comment Exécuter SQL sur la Connexion, mais j'ai parfois juste de créer et de renseigner dans le code, comme indiqué 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);
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X