110

(私はすでにインメモリのH2データベースを見てきました-Spring / Hibernateの質問によるInitスキーマ。ここでは適用されません。)

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

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

4

6 に答える 6

199

はい、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が必要です。

于 2011-03-08T05:05:27.167 に答える
26

でスプリングを使用している場合はapplication.yml、次のように機能します。

spring:
  datasource:
    url: jdbc:h2:mem:mydb;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL;INIT=CREATE SCHEMA IF NOT EXISTS calendar
于 2017-12-29T09:28:11.093 に答える
9

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

于 2018-04-06T14:33:38.567 に答える
8

「デフォルトでは、アプリケーションが呼び出し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);
        }
    }
}
于 2011-03-07T23:02:55.060 に答える
3

Spring Frameworkを使用していて、テストでプロパティapplication.ymlのSQLファイルを検出するのに問題がある場合は、表記を使用できます。INITclasspath:

たとえば、にinit.sqlSQLファイルがある場合はsrc/test/resources、次を使用します

url=jdbc:h2:~/test;INIT=RUNSCRIPT FROM 'classpath:init.sql';DB_CLOSE_DELAY=-1;
于 2019-12-09T20:07:37.867 に答える
0

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=""/>
于 2021-06-28T10:10:24.843 に答える