如何使用Slick和HSQLDB查询数据库表?

时间:2015-04-09 11:02:00

标签: scala jdbc hsqldb slick

我一直在玩Slick(verison 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()

然后在创建表格时,我得到以下内容:

  

对象名已存在:声明中的ARTIST [创建表格“ARTIST”...

任何人都知道为什么这可能不起作用?

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

更新

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

  

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

createIfNotExists foreach中的查询是:

  

SELECT * FROM INFORMATION_SCHEMA.SYSTEM_TABLES WHERE为TRUE且TABLE_CAT为空且TABLE_SCHEM为空且TABLE_NAME ='艺术家'

我明天要进一步调查。

1 个答案:

答案 0 :(得分:0)

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

为了让它发挥作用我必须使用它:

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