【问题标题】:How to query database tables using Slick and HSQLDB?如何使用 Slick 和 HSQLDB 查询数据库表?
【发布时间】:2015-06-14 17:05:22
【问题描述】:

我一直在玩 Slick(2.1.0 版)和 HSQLDB JDBC 驱动程序(2.3.2),我可以创建表并执行 CRUD 查询,但现在我遇到了我似乎无法解决的问题能够获取数据库元数据,特别是现有的表。

这是与How to execute DDL only when tables don't exist? 类似的问题,但这是针对 MySQL 的,该解决方案对我不起作用。

这里有一些代码:

  private def initDatabase() {
    log.info("Initialising song database.")
    db.withSession {
      implicit session =>
        {
          // This doesn't seem to be working...
          val tables = MTable.getTables.list
          log.debug("Existing database tables: {}", tables)

          createIfNotExists(artists, songs, broadcasts)
        }
    }
  }

  private def createIfNotExists(tables: TableQuery[_ <: Table[_]]*)(implicit session: Session) {
    tables foreach { table => if (MTable.getTables(table.baseTableRow.tableName).list.isEmpty) table.ddl.create }
  }

这总是记录:

现有数据库表:List()

然后当创建表时,我得到以下信息:

对象名称已存在:语句 [create table "ARTIST"...中的 ARTIST...

有人知道为什么这可能不起作用吗?

我可以看到驱动程序包含以下方法org.hsqldb.jdbc.JDBCDatabaseMetaData.getTables(String, String, String, String[])(由于某种原因,即使附加了源代码,我似乎也无法在 Eclipse 中对此进行调试)。

更新:

我设法构建了 HSQLDB,并且能够以这种方式对其进行调试。为未过滤列表执行的实际查询是:

SELECT * FROM INFORMATION_SCHEMA.SYSTEM_TABLES WHERE TRUE AND TABLE_CAT 为 NULL 且 TABLE_SCHEM 为 NULL

createIfNotExists foreach 中的查询是:

SELECT * FROM INFORMATION_SCHEMA.SYSTEM_TABLES WHERE TRUE AND TABLE_CAT 为 NULL 且 TABLE_SCHEM 为 NULL 且 TABLE_NAME = 'ARTIST'

我明天必须进一步调查。

【问题讨论】:

    标签: scala jdbc hsqldb slick


    【解决方案1】:

    我终于明白了。我使用 Squirrel SQL 来实际查看我的 HSQLDB 并查看这些表中的内容。事实证明,这些查询的 where 子句中的 TABLE_CAT 和 TABLE_SCHEM 列不为空,它们的值为 PUBLIC。至少对我来说是这样,我没有对 Slick 做任何特别的事情,只是你的沼泽标准提升嵌入。

    所以为了让它工作,我不得不使用这个:

    MTable.getTables(Some("PUBLIC"), Some("PUBLIC"), Some(tableName), Some(Seq("TABLE"))).list
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多