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