我可以让H2在内存数据库中自动创建一个模式吗?

时间:2011-03-07 21:50:44

标签: java sql database h2

(我已经看过H2 database In memory - Init schema via Spring/Hibernate问题;这里不适用。)

我想知道H2中是否有设置允许我在连接时自动创建模式。如果它有帮助,我只对内存中的情况感兴趣。

H2在URL的末尾支持各种以分号分隔的修饰符,但我没有找到一个用于自动创建模式的修饰符。有没有这样的功能?

6 个答案:

答案 0 :(得分:143)

是的,H2支持executing SQL statements when connecting。您可以运行脚本,也可以只运行一两个语句:

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中才需要双反斜杠(\\)。 <{1}}中;之前的反斜杠是必需的。

答案 1 :(得分:7)

“默认情况下,当应用程序调用{​​{1}}并且URL中指定的数据库尚不存在时,将创建一个新的(空)数据库。” - H2 Database

附录:@Thomas Mueller展示了如何Execute SQL on Connection,但我有时只是在代码中创建并填充,如下所示。

DriverManager.getConnection(url, ...)

答案 2 :(得分:7)

如果您使用带有application.yml的spring,则以下内容适用于您

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

答案 3 :(得分:5)

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

答案 4 :(得分:0)

如果您将Spring Framework与application.yml一起使用,并且无法使测试在INIT属性上找到SQL文件,则可以使用classpath:表示法。

例如,如果您在init.sqljust use上有一个src/test/resources SQL文件:

url=jdbc:h2:~/test;INIT=RUNSCRIPT FROM 'classpath:init.sql';DB_CLOSE_DELAY=-1;

答案 5 :(得分: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=""/>