【发布时间】:2014-09-04 16:16:29
【问题描述】:
打开数据库连接后,我想检查数据库是否是新创建的。我正在使用 H2,如果数据库不存在,它会自动创建一个数据库。
我试过这个检查:
db.Public.PUBLIC.getTables().isEmpty()
但这会返回一个静态的表列表(不查询数据库中的架构)。
我可以编写原始 SQL 来获取表列表,但这将特定于数据库引擎。 jOOQ 中是否有通用的替代方案?
【问题讨论】:
打开数据库连接后,我想检查数据库是否是新创建的。我正在使用 H2,如果数据库不存在,它会自动创建一个数据库。
我试过这个检查:
db.Public.PUBLIC.getTables().isEmpty()
但这会返回一个静态的表列表(不查询数据库中的架构)。
我可以编写原始 SQL 来获取表列表,但这将特定于数据库引擎。 jOOQ 中是否有通用的替代方案?
【问题讨论】:
你不能使用:
db.Public.PUBLIC.getTables().isEmpty()
因为生成的元信息没有连接到数据库。相反,您可能想看看DSLContext.meta()。在您的情况下,您只需编写:
DSL.using(configuration).meta().getTables().isEmpty();
如果您经常运行此测试,这当然不是检查是否有任何表的一种非常高效的方法,因为它会将 所有 表提取到内存中只是为了运行 isEmpty() 检查.我建议改为发出实际查询:
int numberOfTables =
DSL.using(configuration)
.select(count())
.from("information_schema.tables")
.where("table_schema = 'PUBLIC'")
.fetchOne(0, int.class);
未来的 jOOQ 版本(3.11 之后)将能够为您提供可在 SQL 或其他地方使用的实际对象存在谓词:
【讨论】: