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

Hasura v2.x自动跟踪所有表失败,求可行解决方案

解决Hasura自动跟踪所有表的问题

问题说明

我正在上手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跟踪命令:

  1. 创建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
  1. 给脚本添加执行权限:
chmod +x track_tables.sh
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:01:05