web-dev-qa-db-ja.com

H2でインメモリデータベースにスキーマを自動作成できますか?

(私はすでに メモリ内のH2データベース-Spring/Hibernateを介したInitスキーマ の質問を見ました;ここでは適用できません。)

H2に接続してスキーマを自動作成できる設定があるかどうかを知りたい。それが役立つ場合、私はインメモリの場合にのみ興味があります。

H2では、URLの末尾でセミコロンで区切られたさまざまな修飾子がサポートされていますが、スキーマを自動的に作成するための修飾子は見つかりませんでした。そのような機能はありますか?

79
Laird Nelson

はい、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内の;の前のバックスラッシュは必須です。

149
Thomas Mueller

Application.ymlでspringを使用している場合、以下が動作します

spring: datasource: url: jdbc:h2:mem:mydb;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL;INIT=CREATE SCHEMA IF NOT EXISTS calendar

8
Marquis Blount

「デフォルトでは、アプリケーションがDriverManager.getConnection(url, ...)を呼び出し、URLで指定されたデータベースがまだ存在しない場合、新しい(空の)データベースが作成されます。」- H2データベース

補遺:@Thomas Muellerが Connection で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);
        }
    }
}
8
trashgod

Thomasが書いたことは正しいです。それに加えて、複数のスキーマを初期化する場合は、次を使用できます。 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();

ref: http://www.h2database.com/html/features.html#execute_sql_on_connection

7
Zeus