Я могу Н2 автосоздание схеме в базы данных в памяти?
(Я уже видел базу данных H2 в схеме memory-Init через Spring / Hibernate question; здесь это не применимо.)
Я хотел бы знать, есть ли настройка в H2, которая позволит мне автоматически создавать схему при подключении к ней. Если это поможет, меня интересует только случай в памяти.
H2 поддерживает различные разделенные точкой с запятой модификаторы в конце URL, но я не нашел один для автоматического создания схемы. Есть ли такая функция?
4 ответа:
да, H2 поддерживает выполнение инструкций SQL при подключении. Вы можете запустить скрипт, или просто заявление или два:
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'";
обратите внимание на двойную обратную косую черту (
\
) требуется только в Java. Обратная косая черта (ы) перед;
внутри - это.
"по умолчанию, когда приложение называет
DriverManager.getConnection(url, ...)
и база данных, указанная в URL-адресе, еще не существует, создается новая (пустая) база данных."- База Данных H2.добавление: @Thomas Mueller показывает, как выполнить SQL при подключении, но я иногда просто создаю и заполняю код, как предлагается ниже.
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); } } }
Если вы используете spring с приложением.yml следующее будет работать для вас
spring: datasource: url: jdbc:h2:mem:mydb;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL;INIT=CREATE SCHEMA IF NOT EXISTS calendar
то, что Томас написал правильно, в дополнение к этому, если вы хотите инициализировать несколько схем, вы можете использовать следующее. Примечание
\;
разделение двух операторов 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();
ref:http://www.h2database.com/html/features.html#execute_sql_on_connection