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