GitHub Actions运行Hasura CI测试时migrate apply报数据库不存在错误
问题核心原因
报错database not found: error determining database kind for default, check if database exists on hasura和--database-name参数传值无关,你传入default是正确取值。触发报错的根本原因是运行中的Hasura实例没有注册名为default的数据库连接,CLI执行迁移操作时找不到对应目标库。
逐项修复方案
- 补全Hasura服务健康检查
当前配置里Postgres服务加了健康检查,但Hasura服务没有,GitHub Actions会在服务容器启动后立刻执行后续步骤,不会等待Hasura完成初始化流程,此时Hasura还没完成数据库连接注册,操作就会失败。给Hasura服务补充如下健康检查配置,原有env、ports配置保留即可:
hasura: image: hasura/graphql-engine:v2.6.2 options: >- --health-cmd "wget --no-verbose --tries=1 --spider http://localhost:8080/healthz || exit 1" --health-interval 10s --health-timeout 5s --health-retries 10
- 修正Hasura数据库连接环境变量
v2.6.2版本的Hasura不会自动把元数据库注册为业务用的default库,你当前配置里的PG_DATABASE_URL是v1版本的废弃变量,v2版本不会识别。删除PG_DATABASE_URL配置,新增显式注册default数据库的环境变量:HASURA_GRAPHQL_DATABASES_DEFAULT_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres - 调整Hasura操作步骤顺序
当前的执行顺序metadata apply -> migrate apply -> metadata reload不符合逻辑,干净启动的Hasura实例没有自定义元数据,如果本地元数据文件里没有包含default库的连接定义,先执行metadata apply会覆盖默认配置,导致default库丢失。调整步骤顺序为:- 校验Hasura服务连通性
- 执行
migrate apply --database-name default同步表结构 - 执行
metadata apply同步Hasura元数据 - 执行
metadata reload确认元数据生效 - 执行
seeds apply --database-name default导入种子数据
- 增加前置连通性校验
在所有Hasura操作步骤前增加校验步骤,排除偶发网络问题:
- name: Verify Hasura service status run: curl -f http://hasura:8080/healthz
排查校验手段
如果调整后仍然报错,在执行迁移命令前加一步调用Hasura元数据接口,查询当前已注册的数据库列表,确认default库是否存在:
curl -H "X-Hasura-Admin-Secret: super-secret" http://hasura:8080/v1/metadata \ -d '{"type":"pg_get_sources","args":{}}'
正常返回的结果中会包含name为default、kind为postgres的数据库条目;如果返回为空,说明Hasura启动时的环境变量配置未生效,检查变量拼写、数据库连接地址格式是否正确。
内容的提问来源于stack exchange,提问作者stanley oguazu
相关产品推荐
相关产品推荐

