(J’ai déjà vu la firebase database H2 In memory – Init schema via la question Spring / Hibernate ; elle 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 lors de la connexion. Si cela peut vous 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 pas trouvé pour créer automatiquement un schéma. Y a-t-il une telle fonctionnalité?
Oui, H2 prend en charge l’ exécution des instructions SQL lors de la connexion . Vous pouvez exécuter un script, ou simplement une déclaration ou deux:
Ssortingng url = "jdbc:h2:mem:test;" + "INIT=CREATE SCHEMA IF NOT EXISTS TEST" Ssortingng url = "jdbc:h2:mem:test;" + "INIT=CREATE SCHEMA IF NOT EXISTS TEST\\;" + "SET SCHEMA TEST"; Ssortingng url = "jdbc:h2:mem;" + "INIT=RUNSCRIPT FROM '~/create.sql'\\;" + "RUNSCRIPT FROM '~/populate.sql'";
Veuillez noter que la double barre oblique inverse ( \\
) n’est requirejse que dans Java. La barre oblique inverse avant ;
dans l’ INIT
est requirejs.
“Par défaut, lorsqu’une application appelle DriverManager.getConnection(url, ...)
et que la firebase database spécifiée dans l’URL n’existe pas encore, une nouvelle firebase database (vide) est créée.” – Base de données H2 .
Addendum: @Thomas Mueller montre comment exécuter SQL on Connection , mais je crée parfois simplement 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(Ssortingng[] 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()) { Ssortingng name = rset.getSsortingng(1); System.out.println(name); } } }
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
Ce que Thomas a écrit est correct, en plus de cela, si vous voulez initialiser plusieurs schémas, vous pouvez utiliser ce qui suit. Notez qu’il y a un \\;
séparer les deux déclarations 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