簡體   English   中英

我可以讓 H2 在內存數據庫中自動創建模式嗎?

[英]Can I have H2 autocreate a schema in an in-memory database?

(我已經看過內存中H2 數據庫 - Init schema via Spring/Hibernate問題;它在這里不適用。)

我想知道 H2 中是否有一個設置可以讓我在連接到它時自動創建一個架構。 如果有幫助,我只對內存中的情況感興趣。

H2 支持 URL 末尾的各種以分號分隔的修飾符,但我沒有找到用於自動創建架構的修飾符。 有這樣的功能嗎?

是的,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 中是必需的。 之前的反斜杠; INIT是必需的。

如果您將 spring 與application.yml一起application.yml ,以下內容對您有用:

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

Thomas 所寫的內容是正確的,除此之外,如果您想初始化多個模式,您可以使用以下內容。 注意有一個\\\\; 將兩個 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 中指定的數據庫尚不存在時,會創建一個新的(空)數據庫。”— 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);
        }
    }
}

如果您將 Spring Framework 與application.yml一起application.yml ,並且無法讓測試在INIT屬性上找到 SQL 文件,則可以使用classpath:表示法。

例如,如果您在src/test/resources上有一個init.sql SQL 文件, 只需使用

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=""/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM