Hasura v2.x自动跟踪所有表失败,求可行解决方案
问题说明
我正在上手Hasura,当前配置如下:
docker-compose.yml
version: "3.6" services: postgres: image: postgres:15 restart: always volumes: - db_data:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: postgrespassword graphql-engine: build: context: . dockerfile: DockerfileHasura # command: /bin/sh -c 'hasura metadata track --all-tables --all-relationships --schema public --endpoint http://graphql-engine:8080 && exec graphql-engine serve' command: /bin/sh -c 'exec graphql-engine serve' ports: - "8080:8080" restart: always volumes: - ./migrations:/hasura-migrations - ./metadata:/hasura-metadata - ./track_tables.sh:/track_tables.sh environment: HASURA_GRAPHQL_METADATA_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres PG_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console HASURA_GRAPHQL_DEV_MODE: "true" HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log HASURA_GRAPHQL_CORS_DOMAIN: "*" volumes: db_data:
DockerfileHasura
FROM hasura/graphql-engine:v2.33.0 RUN curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash
尝试用旧命令hasura metadata track --all-tables...启动时容器退出(code 1),Hasura v2.x已不支持该启动顺序。当前数据库存在product表,但Hasura控制台看不到任何表/视图,查询时提示"field 'product' not found in type: 'query_root'",需求是让Hasura默认自动跟踪所有新建的表。
解决方案
方法1:使用自动跟踪环境变量(推荐,v2.20+适用)
Hasura v2.20及以上版本支持HASURA_GRAPHQL_AUTO_TRACK_TABLES环境变量,可直接配置自动跟踪指定schema下的所有表(含新建表)。
修改docker-compose.yml中graphql-engine的环境变量,添加:
HASURA_GRAPHQL_AUTO_TRACK_TABLES: "public.*"
完整环境变量部分示例:
environment: HASURA_GRAPHQL_METADATA_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres PG_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres HASURA_GRAPHQL_ENABLE_CONSOLE: "true" HASURA_GRAPHQL_DEV_MODE: "true" HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log HASURA_GRAPHQL_CORS_DOMAIN: "*" HASURA_GRAPHQL_AUTO_TRACK_TABLES: "public.*"
此配置会自动跟踪public schema下的所有现有表,之后新建的表也会被自动识别,无需手动操作。
方法2:启动就绪后执行批量跟踪脚本
如果需要更灵活的控制,可编写脚本等待Hasura服务就绪后,执行CLI跟踪命令:
- 创建
track_tables.sh脚本:
#!/bin/sh # 启动Hasura服务 graphql-engine serve & SERVICE_PID=$! # 等待服务健康检查通过 until curl -s http://localhost:8080/healthz > /dev/null; do echo "等待Hasura服务就绪..." sleep 2 done # 跟踪public schema下所有表和关联关系 hasura metadata track --all-tables --all-relationships --schema public --endpoint http://localhost:8080 # 保持主进程运行 wait $SERVICE_PID
- 给脚本添加执行权限:
chmod +x track_tables.sh
- 修改docker-compose.yml中graphql-engine的command:
command: /bin/sh /track_tables.sh
方法3:通过元数据文件预定义跟踪规则
Hasura v2.x使用元数据文件管理跟踪配置,可手动创建或导出元数据后修改:
在./metadata/databases/default/tables/目录下创建public.product.yaml(对应product表),内容示例:
table: schema: public name: product array_relationships: [] object_relationships: [] select_permissions: - role: admin permission: columns: "*" filter: {} insert_permissions: [] update_permissions: [] delete_permissions: []
若要批量跟踪所有表,可先通过Hasura CLI导出元数据(在本地已连接Hasura服务的情况下):
hasura metadata export
导出后将metadata目录挂载到容器,Hasura启动时会加载这些配置。
内容的提问来源于stack exchange,提问作者Maifee Ul Asad

