我一直在玩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 ='艺术家'
我明天要进一步调查。
答案 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