(私はすでにインメモリのH2データベースを見てきました-Spring / Hibernateの質問によるInitスキーマ。ここでは適用されません。)
H2に、接続時にスキーマを自動作成できる設定があるかどうかを知りたいのですが。それが役に立ったら、私はメモリ内の場合にのみ興味があります。
H2は、URLの末尾でさまざまなセミコロン区切りの修飾子をサポートしていますが、スキーマを自動的に作成するための修飾子が見つかりませんでした。そのような機能はありますか?
(私はすでにインメモリのH2データベースを見てきました-Spring / Hibernateの質問によるInitスキーマ。ここでは適用されません。)
H2に、接続時にスキーマを自動作成できる設定があるかどうかを知りたいのですが。それが役に立ったら、私はメモリ内の場合にのみ興味があります。
H2は、URLの末尾でさまざまなセミコロン区切りの修飾子をサポートしていますが、スキーマを自動的に作成するための修飾子が見つかりませんでした。そのような機能はありますか?
はい、H2は接続時にSQLステートメントの実行をサポートしています。スクリプトを実行することも、1つまたは2つのステートメントを実行することもできます。
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
が必要です。
でスプリングを使用している場合はapplication.yml
、次のように機能します。
spring:
datasource:
url: jdbc:h2:mem:mydb;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL;INIT=CREATE SCHEMA IF NOT EXISTS calendar
トーマスが書いたことは正しいです、それに加えて、複数のスキーマを初期化したい場合は、以下を使用できます。\\;
2つの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();
参照:http ://www.h2database.com/html/features.html#execute_sql_on_connection
「デフォルトでは、アプリケーションが呼び出しDriverManager.getConnection(url, ...)
、URLで指定されたデータベースがまだ存在しない場合、新しい(空の)データベースが作成されます。」— <a href = "http://www.h2database.com/html/features html#database_only_if_exists "rel =" noreferrer">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 Frameworkを使用していて、テストでプロパティapplication.yml
のSQLファイルを検出するのに問題がある場合は、表記を使用できます。INIT
classpath:
たとえば、にinit.sql
SQLファイルがある場合はsrc/test/resources
、次を使用します。
url=jdbc:h2:~/test;INIT=RUNSCRIPT FROM 'classpath:init.sql';DB_CLOSE_DELAY=-1;
Springおよびxml構成を使用している場合、これを行う方法の例を次に示します。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" depends-on="h2Server">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url"
value="jdbc:h2:mem:testdb;INIT=RUNSCRIPT FROM 'classpath:db/create_tables.sql'\;RUNSCRIPT FROM 'classpath:db/insert.sql';TRACE_LEVEL_FILE=4;TRACE_LEVEL_SYSTEM_OUT=3;"/>
<property name="username" value="sa"/>
<property name="password" value=""/>