【发布时间】: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'
我明天必须进一步调查。
【问题讨论】: