You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用database-rider向含GENERATED ALWAYS列的表插入DataSet?

DBRider插入PostgreSQL GENERATED ALWAYS自增列解决方案

错误原因

报错的根本原因是DBUnit(DBRider底层依赖的数据库测试组件)默认会将dataset中未显式声明的字段赋值为null进行插入,而你的group_id是GENERATED ALWAYS AS IDENTITY类型,PostgreSQL禁止用户手动向该类列插入任何值(包括null),必须由数据库自动生成。


方案1:自定义列过滤规则(无需修改表结构,推荐)

通过DBRider提供的列过滤能力,插入时直接跳过自增标识列,让数据库自动生成值:

  1. 自定义列过滤实现类:
import org.dbunit.dataset.Column;
import org.dbunit.dataset.filter.IColumnFilter;

public class IgnoreIdentityColumnFilter implements IColumnFilter {
    @Override
    public boolean accept(String tableName, Column column) {
        // 跳过groups表的group_id列,有多张表的自增列可以在这里扩展规则
        return !("groups".equals(tableName) && "group_id".equals(column.getColumnName()));
    }
}
  1. 在测试类/测试方法上的@DBUnit注解中指定过滤规则:
import com.github.database.rider.core.api.configuration.DBUnit;
import com.github.database.rider.junit5.api.DBRider;
import org.junit.jupiter.api.Test;

@DBRider
@DBUnit(columnFilter = IgnoreIdentityColumnFilter.class)
public class GroupTest {
    // 你的测试逻辑
}

配置完成后重新运行测试,DBUnit插入数据时会忽略group_id列,PostgreSQL会自动生成该列的自增数值。


方案2:调整表Identity生成策略(可选)

如果可以接受修改表结构,将GENERATED ALWAYS改为GENERATED BY DEFAULT:

ALTER TABLE groups 
ALTER COLUMN group_id SET GENERATED BY DEFAULT;

该模式下如果插入语句没有携带group_id的值、或传入null,PostgreSQL都会自动生成对应值,无需额外配置DBRider也能正常插入。


内容的提问来源于stack exchange,提问作者Jantao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:54:01