SpringMVC+MyBatis项目:DBUnit无法操作PostgreSQL外部表的问题咨询
解决DBUnit无法识别PostgreSQL外部表的问题
我之前在项目里也遇到过DBUnit无法识别PostgreSQL外部表的情况,结合你的场景(sv1通过外部表导入sv2的tbl2),给你几个可行的解决思路:
1. 确保DBUnit连接的Schema和权限正确
首先要确认DBUnit使用的数据库连接是指向sv1的,并且当前用户对public.tbl2这个外部表有足够的权限(至少需要INSERT、SELECT权限)。另外,DBUnit可能默认没有指定Schema,导致找不到表,你可以显式指定Schema:
// 获取JDBC连接后初始化DBUnit连接 DatabaseConnection dbUnitConn = new DatabaseConnection(jdbcConnection); // 显式设置Schema为public dbUnitConn.getConfig().setProperty(DatabaseConfig.PROPERTY_SCHEMA, "public");
或者在添加表的时候带上Schema前缀:
QueryDataSet dataSet = new QueryDataSet(dbUnitConn); dataSet.addTable("public.tbl2");
2. 刷新DBUnit的元数据缓存
DBUnit会缓存数据库的表元数据,可能没识别到你刚导入的外部表。你可以在测试前手动刷新元数据:
DatabaseConnection dbUnitConn = new DatabaseConnection(jdbcConnection); // 刷新元数据,让DBUnit重新读取系统表中的表信息 dbUnitConn.refreshMetaData();
这样DBUnit就能重新识别到新添加的外部表了。
3. 验证外部表的可见性和权限
先在psql客户端里连接sv1,执行\dt public.tbl2确认外部表确实存在。如果存在,再检查DBUnit使用的数据库用户是否有操作权限:
-- 给用户授予tbl2的操作权限 GRANT ALL ON public.tbl2 TO your_db_unit_user;
外部表的权限需要单独配置,即使用户有public schema的权限也可能不够。
4. 自定义元数据处理器识别外部表
PostgreSQL的外部表在系统表中的类型是FOREIGN TABLE,而DBUnit默认的元数据处理器只会识别普通的TABLE类型。你可以自定义一个处理器让DBUnit识别外部表:
public class PostgresForeignTableHandler extends DefaultMetaDataHandler { @Override public boolean isTable(String tableName, String tableType) { // 同时识别普通表和外部表 return super.isTable(tableName, tableType) || "FOREIGN TABLE".equals(tableType); } }
然后把这个处理器配置到DBUnit连接中:
DatabaseConnection dbUnitConn = new DatabaseConnection(jdbcConnection); dbUnitConn.getConfig().setProperty( DatabaseConfig.PROPERTY_META_DATA_HANDLER, new PostgresForeignTableHandler() );
按照上面的步骤逐一排查,应该就能解决DBUnit找不到外部表的问题了。
内容的提问来源于stack exchange,提问作者Tuan Anh Le
相关产品推荐
相关产品推荐

