我一直在我的机器上编写一个 java 应用程序,它可以使用我设置的数据库完美运行,但是当我在现场安装它时它会爆炸,因为数据库略有不同。
所以我正在编写一些代码来验证:
A: 我的数据库详细信息是正确的
B:数据库有我期望的所有表,并且它们有正确的列。
我有A下来,但我不知道从哪里开始B,有什么建议吗?
目标数据库适用于当前客户端是 Oracle,但该应用程序也可以配置为在 SQL Server 上运行。所以一个通用的解决方案将不胜感激,但不是必要的,因为我确信我可以弄清楚如何从另一个做一个。
我一直在我的机器上编写一个 java 应用程序,它可以使用我设置的数据库完美运行,但是当我在现场安装它时它会爆炸,因为数据库略有不同。
所以我正在编写一些代码来验证:
A: 我的数据库详细信息是正确的
B:数据库有我期望的所有表,并且它们有正确的列。
我有A下来,但我不知道从哪里开始B,有什么建议吗?
目标数据库适用于当前客户端是 Oracle,但该应用程序也可以配置为在 SQL Server 上运行。所以一个通用的解决方案将不胜感激,但不是必要的,因为我确信我可以弄清楚如何从另一个做一个。
你会想要查询数据库的 information_schema,这里有一些 Oracle 的例子,我知道的每个平台都有类似的东西。
您可能可以为此使用像 LiquiBase 这样的数据库迁移工具——这些工具中的大多数都有某种检查数据库的方法。我没有使用它的第一手经验,所以这是一个猜测。
最通用的解决方案是在 try catch 块中使用具有预期列的 select 子句和具有表名的 from 子句执行查询。您可以将 where 子句设置为 1=2 以免获取任何数据。如果查询执行时没有抛出异常,那么您就得到了预期的表和列。
首先编写数据库创建脚本可能会更好地处理略有不同的部分。自动化过程使您有更好的机会使两者相同。
另一点值得一提的是,您可以通过使您的 devl 和 prod 环境相同来最小化您的风险 - 相同的数据库架构和供应商。改变使两者不同的环境。
最后,你没有说什么是“稍微”不同的,但有时这些是不可避免的(例如,Oracle 使用序列,SQL Server 使用标识)。也许 Hibernate 可以帮助您更可靠地在供应商之间切换。它以这样一种方式抽象细节,即更改数据库可能意味着修改配置文件中的单个值。
您需要的基本上是数据库的单元测试。“必须存在名为 FOOBAR 的列,类型必须是整数。不能存在外键等。”
这对于普通的 JUnit 和 JDBC(向表询问其元数据)是可行的,因为您可能希望确保您绝对确定正在做什么,而使用 dbUnit 时可能会更难。
您可以使用 Oracle 中的这些表来检查表、列、视图等是否存在
USER_TABLES USER_VIEWS USER_PROCEDURE
(或所有)USER_OBJECTS WHERE OBJECT_TYPE = '??'
继续... USER_TAB_COLS 用于表列
问候 K
如果您使用的是普通 JDBC,则应尝试使用此方法:DatabaseMetadata.getTables和元数据类中可用的其他类似方法。
我为此使用MigrateDB。它使您可以构建查询来执行诸如检查给定数据库的给定表、列、行、索引等是否存在,并将它们用作“测试”。如果测试失败,它会触发一个“动作”(这只是另一个知道如何解决问题的查询。)
MigrateDB 支持多种数据库平台(例如,您可以为每个平台指定“检查表是否存在查询”),完全可配置的测试(您可以自己制作),带有相当完整的 Oracle 测试,并且可以在“仅审核”模式,以便它只告诉您差异是什么。
这是一个不错的、强大的解决方案。