【问题标题】:Enumerate database tables with JDBI使用 JDBI 枚举数据库表
【发布时间】:2015-06-18 12:04:35
【问题描述】:

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

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

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

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

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

handle.execute("show tables");

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

或者我需要求助于 JDBC 吗?

【问题讨论】:

    标签: java mysql jdbc dropwizard jdbi


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案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's 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-15
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 2016-08-03
        相关资源
        最近更新 更多