如何设置默认架构和数据库?

20

我正在使用Liquibase来更新我的数据库,并且使用H2进行测试。

我使用Spring来配置属性。

dataSource.setUrl("jdbc:h2:mem:test_common");

我希望连接到test_common数据库,但不成功。

我意识到在H2database != Schema,因此我尝试将默认模式设置为test_common

dataSource.setUrl("jdbc:h2:mem:test_common;INIT=CREATE SCHEMA test_common\\; SET SCHEMA test_common");

但是这没有奏效,我看到的日志是:

INFO 5/26/14 2:24 PM:liquibase: Dropping Database Objects in schema: TEST_COMMON.PUBLIC
INFO 5/26/14 2:24 PM:liquibase: Creating database history table with name: PUBLIC.DATABASECHANGELOG
INFO 5/26/14 2:24 PM:liquibase: Creating database history table with name: PUBLIC.DATABASECHANGELOG
INFO 5/26/14 2:24 PM:liquibase: Successfully released change log lock
INFO 5/26/14 2:24 PM:liquibase: Successfully acquired change log lock
INFO 5/26/14 2:24 PM:liquibase: Reading from PUBLIC.DATABASECHANGELOG
INFO 5/26/14 2:24 PM:liquibase: Reading from PUBLIC.DATABASECHANGELOG
INFO 5/26/14 2:24 PM:liquibase: Reading from PUBLIC.DATABASECHANGELOG
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-1.xml::05192014.1525::h2: Reading from PUBLIC.DATABASECHANGELOG
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-1.xml::05192014.1525::h2: Table network created
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-1.xml::05192014.1525::h2: ChangeSet liquibase/2014/1-1.xml::05192014.1525::h2 ran successfully in 5ms
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-1.xml::05192014.1525::h2: Reading from PUBLIC.DATABASECHANGELOG
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-2.xml::05192014.1525::h2: Reading from PUBLIC.DATABASECHANGELOG
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-2.xml::05192014.1525::h2: New row inserted into network
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-2.xml::05192014.1525::h2: New row inserted into network
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-2.xml::05192014.1525::h2: New row inserted into network
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-2.xml::05192014.1525::h2: New row inserted into network
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-2.xml::05192014.1525::h2: New row inserted into network
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-2.xml::05192014.1525::h2: New row inserted into network
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-2.xml::05192014.1525::h2: ChangeSet liquibase/2014/1-2.xml::05192014.1525::h2 ran successfully in 5ms
INFO 5/26/14 2:24 PM:liquibase: liquibase/changelog.xml: liquibase/2014/1-2.xml::05192014.1525::h2: Reading from PUBLIC.DATABASECHANGELOG

我该如何在H2中设置默认模式和数据库名称?


为什么连接到 test_common 数据库不起作用?你的代码是否以编程方式查找了数据库/模式名称? - gerrytan
是的,可以使用Spring Framework中的@Configuration类来实现。请参考http://stackoverflow.com/questions/23874693/liquibase-does-not-honor-schema-name-for-h2-but-mysql-is-fine - daydreamer
2个回答

21

默认模式是PUBLIC

据H2数据库网站上的Commands页面关于SET SCHEMA命令的介绍:

新连接的默认模式为PUBLIC

该文档还指出,您可以在连接时指定默认模式:

此设置可以追加到数据库URL中:jdbc:h2:test;SCHEMA=ABC

只有一个数据库

至于访问多个数据库,H2不支持SQL标准的CLUSTERCATALOG概念。您可以通过JDBC URL连接到一个特定的数据库(目录)。对该数据库的连接仅限于该单个数据库。请参阅由Thomas Mueller回答的问题:Can you create multiple catalogs in H2?

您可以打开另一个连接到另一个数据库,但它将是完全独立的。

因此,谈论“默认数据库”在H2数据库中没有意义。


1
如果连接URL的一部分中不存在模式,则可以创建模式 - https://dev59.com/ym435IYBdhLWcg3wxDBp - Alexander Taylor

1

看起来您正在通过Java API与Liquibase进行交互。在Database对象上有一个setDefaultSchemaName()方法,您可以使用它来设置不同的默认模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接