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