【问题标题】:How to check if a database exists in Hsqldb/Derby?如何检查 Hsqldb/Derby 中是否存在数据库?
【发布时间】:2011-04-17 15:17:30
【问题描述】:

我正在寻找如何在 hsqldb 和 Apache derby 中通过 Java 代码检查数据库是否存在的信息。在 Mysql 中这很容易,因为我可以查询一个系统表——INFORMATION_SCHEMA.SCHEMATA——但是这两个数据库似乎没有这样的表。

什么是mysql查询的替代方法:

 SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = <DATABASE NAME>

查找数据库是否存在于 hsqldb 和 apache derby 中?

【问题讨论】:

标签: derby hsqldb


【解决方案1】:

检查数据库是否存在

一种解决方案是将“;ifexists=true”附加到数据库 URL 并尝试以这种方式打开数据库。如果数据库不存在,你会得到一个异常。这适用于 HSQLDB 和 H2 数据库。对于 Apache Derby,附加“;create=false”(实际上,只需确保没有“;create=true”)。 ";create=false" 也适用于 H2 数据库,但不适用于 HSQLDB(在那里它被简单地忽略了)。这种“;ifexists=true”/“;create=false”技巧的缺点是:您将使用异常处理来进行应用程序流控制,应该避免这种情况(不仅因为抛出异常很慢)。此外,您会打开一个您可能不想要的连接。更新:如果数据库不存在并且您使用“;ifexists=true”,HSQLDB 2.x 似乎会将堆栈跟踪打印到 System.err(!),此外还会引发异常。

您可以检查数据库文件是否存在。缺点是这取决于数据库 URL 如何映射到文件名,这取决于数据库内部结构,例如数据库类型和数据库版本(!),还可能取决于系统属性。对于 Derby,您需要检查目录是否存在,另外还需要检查一些文件,例如“service.properties”(似乎)。对于 HSQLDB,您可以检查文件 databaseName.properties 是否存在。对于 H2,检查文件 databaseName.h2.db。这是当前版本的 Derby / HSQLDB / H2,未来可能会改变。

问题当然是:为什么需要知道数据库是否已经存在?

检查架构是否存在

也许您实际上并不想检查 数据库 是否存在。相反,您只想检查给定的 schema 是否存在于数据库中。为此,您可以使用

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '<SCHEMA NAME>'

这适用于 HSQLDB(从 2.x 版开始)和 H2。它也适用于其他数据库。一个例外是 Derby,它不支持标准化的 INFORMATION_SCHEMA 模式。

【讨论】:

  • 我有一个专门的客户端实现——创建复杂的数据库模式等——用于 mysql,我想要一个使用本地 derby 或 hsqldb 运行测试的 junit。在我的 mysql 客户端中,我使用 SCHEMATA 来确定数据库或表是否存在。所以我必须更改实现以使我的代码可移植到 hsqldb。
  • 那么,这样做的共识是:使用 File.class 检查 derby db 文件是否存在,如果不存在,则使用 create=true 参数创建连接,否则使用 create=false 参数?跨度>
  • @djangofan 我认为如果数据库已经存在(在这种情况下它是无操作的),您也可以使用 create=true 。但我建议阅读 Derby 文档,因为我对 Derby 不是很熟悉。
  • @Mueller - 我在“猜测”同样的事情,但在文档中的任何地方都找不到。链接任何人?
  • @ThomasMueller 如何检查我创建的用户是否存在于 HSQLDB 中
【解决方案2】:

对于 HSQLDB 2.0(使用最新快照以更好地与 MySQL 兼容),您无需进行太多更改,只要您的数据库/架构不称为“PUBLIC”。

连接到可以是全内存数据库的测试数据库将默认创建一个空数据库(其中包含 PUBLIC 模式)。使用后

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'DATABASE NAME'

请注意,名称应该用单引号括起来。我不知道 MySQL 是否接受单引号中的名称。

如果架构不存在,则运行您的架构创建代码,就像使用 MySQL 一样。

【讨论】:

  • 如何检查用户是否存在于 HSQLDB 中
  • INFORMATION_SCHEMA.AUTHORIZATIONS 表包含用户名。
  • 我的意思是,如果不存在,我可以像 CREATE USER 一样检查
  • 阅读指南。 CREATE USER 不支持 IF NOT EXISTS。
【解决方案3】:

由于 Derby 数据库本质上是以数据库名称作为目录名称的目录,因此您可以通过提供目录的路径来检查该目录是否存在:

if (Files.isDirectory(Paths.get("employees"))) {
    System.out.println("Database already exists");
}
else {
    // Code to create database
}

在我的示例中,我正在检查一个名为“employees”的数据库,该数据库嵌入在我的项目结构中。您可以提供数据库的绝对路径或相对路径。

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多