1

有没有办法使用 JDBI 来获取有关模式中包含哪些表的信息?

我有两个数据库AB,我需要能够

  1. 查询A并从中检索表列表;
  2. 查询B并检查这些相同的表是否存在并具有相同的定义(我不关心表中的数据)。

我可以mysqldump从命令行使用:CREATE TABLE从每个数据库中检索语句并进行比较。但现在我需要在 Dropwizard/JDBI 上下文中将其作为测试的一部分进行。

文档有点稀疏,但我找不到任何适合我这样做的东西。我也许可以

handle.execute("show tables");

等等,但这似乎有点低,我希望有更好的方法。

还是我需要求助于 JDBC?

4

2 回答 2

2

JDBC 有几个独立于数据库提供者的机制。

从连接中,您可以获得DatabaseMetaData,并对其进行表达式查询(null = any)。

DatabaseMetaData meta = connection.getMetaData();
ResultSet rs = meta.getColumns(...);

请注意:名称可能在此处等处区分大小写。

于 2015-06-18T12:20:49.403 回答
2

我自己也遇到了这个。 JDBI不提供高级 API 来执行您的要求,因此您需要使用JDBC API。也就是说,以防万一您不知道,JDBI 提供了对底层Connection对象的访问作为 JDBC 的入口点:

DBI dbi = ...;
try (Handle h = dbi.open()) {
  try (Connection c = h.getConnection()) {
    try (ResultSet tables = c.getMetaData().getColumns(null, schema, "%", "%")) {
      // loop over columns/tables here...
    }
  }
}

根据您的要求,您还可以查看Liquibase 的 diff功能,它可以满足您开箱即用的需求:

liquibase.sh --driver=oracle.jdbc.OracleDriver \
        --url=jdbc:oracle:thin:@testdb:1521:test \
        --username=bob \
        --password=bob \
    diff \
        --referenceUrl=jdbc:oracle:thin:@localhost/XE \
        --referenceUsername=bob \
        --referencePassword=bob
于 2017-09-06T14:35:13.037 回答