1

我一直在我的机器上编写一个 java 应用程序,它可以使用我设置的数据库完美运行,但是当我在现场安装它时它会爆炸,因为数据库略有不同。

所以我正在编写一些代码来验证:

  • A: 我的数据库详细信息是正确的

  • B:数据库有我期望的所有表,并且它们有正确的列。

我有A下来,但我不知道从哪里开始B,有什么建议吗?

目标数据库适用于当前客户端是 Oracle,但该应用程序也可以配置为在 SQL Server 上运行。所以一个通用的解决方案将不胜感激,但不是必要的,因为我确信我可以弄清楚如何从另一个做一个。

4

9 回答 9

4

你会想要查询数据库的 information_schema,这里有一些 Oracle 的例子,我知道的每个平台都有类似的东西。

http://www.alberton.info/oracle_meta_info.html

于 2009-01-30T12:38:18.397 回答
1

您可能可以为此使用像 LiquiBase 这样的数据库迁移工具——这些工具中的大多数都有某种检查数据库的方法。我没有使用它的第一手经验,所以这是一个猜测。

于 2009-01-30T12:38:23.407 回答
1

我使用DbUnit来测试数据库。它是一个基于 Java 的解决方案,可以与Junit很好地集成。几乎没有 Java 就可以使用它。我没有在与您描述的完全相同的情况下使用它,但它应该足够接近才能工作。

于 2009-01-30T12:40:25.273 回答
0

最通用的解决方案是在 try catch 块中使用具有预期列的 select 子句和具有表名的 from 子句执行查询。您可以将 where 子句设置为 1=2 以免获取任何数据。如果查询执行时没有抛出异常,那么您就得到了预期的表和列。

于 2009-01-30T12:39:13.450 回答
0

首先编写数据库创建脚本可能会更好地处理略有不同的部分。自动化过程使您有更好的机会使两者相同。

另一点值得一提的是,您可以通过使您的 devl 和 prod 环境相同来最小化您的风险 - 相同的数据库架构和供应商。改变使两者不同的环境。

最后,你没有说什么是“稍微”不同的,但有时这些是不可避免的(例如,Oracle 使用序列,SQL Server 使用标识)。也许 Hibernate 可以帮助您更可靠地在供应商之间切换。它以这样一种方式抽象细节,即更改数据库可能意味着修改配置文件中的单个值。

于 2009-01-30T12:48:38.893 回答
0

您需要的基本上是数据库的单元测试。“必须存在名为 FOOBAR 的列,类型必须是整数。不能存在外键等。”

这对于普通的 JUnit 和 JDBC(向表询问其元数据)是可行的,因为您可能希望确保您绝对确定正在做什么,而使用 dbUnit 时可能会更难。

于 2009-01-30T12:53:00.100 回答
0

您可以使用 Oracle 中的这些表来检查表、列、视图等是否存在

USER_TABLES USER_VIEWS USER_PROCEDURE

(或所有)USER_OBJECTS WHERE OBJECT_TYPE = '??'

继续... USER_TAB_COLS 用于表列

问候 K

于 2009-01-30T13:20:16.723 回答
0

如果您使用的是普通 JDBC,则应尝试使用此方法:DatabaseMetadata.getTables和元数据类中可用的其他类似方法。

于 2009-01-30T13:31:14.080 回答
0

我为此使用MigrateDB。它使您可以构建查询来执行诸如检查给定数据库的给定表、列、行、索引等是否存在,并将它们用作“测试”。如果测试失败,它会触发一个“动作”(这只是另一个知道如何解决问题的查询。)

MigrateDB 支持多种数据库平台(例如,您可以为每个平台指定“检查表是否存在查询”),完全可配置的测试(您可以自己制作),带有相当完整的 Oracle 测试,并且可以在“仅审核”模式,以便它只告诉您差异是什么。

这是一个不错的、强大的解决方案。

于 2009-01-30T15:46:54.507 回答