2022:Hasura v.2.1.1
要从 postgres/Hasura 实例导出数据,我们需要使用 Postman 或 curl 客户端对隐藏的 Hasura 端点 /v1alpha1/pg_dump 发出 http POST 请求,如下所示:
http://<your-hasura-host>/v1alpha1/pg_dump
curl 命令示例:
curl -d '{"opts": ["-a", "-O", "-x", "--inserts", "--exclude-schema=hdb_catalog"], "clean_output": true, "source": "default"}' -H "x-hasura-admin-secret:your-admin-secret-here" http://your-hasura-host/v1alpha1/pg_dump
上面添加了一个标头来指定您的 Hasura 管理员密码:
x-hasura-admin-secret:<your admin secret key>
-d 为 pg_dump 和 Hasura 的端点处理程序添加了一个带有选项(“opts”)的 JSON 正文:
{
"opts": ["-a", "-O", "-x", "--inserts", "--exclude-schema=hdb_catalog"],
"clean_output": true,
"source": "default"
}
上面的 pg_dump 选项(“opts”)是:
-
-a:仅数据,不是模式
-
-O: 没有所有权声明
-
-x: 没有访问权限声明
-
--inserts:使用 SQL 语句,而不是 psql 命令
-
--exclude-schema=hdb_catalog: 没有 Hasura 迁移/元数据相关记录,只有我们的数据
clean_output 键/值从转储输出中删除一堆 SET 语句和 cmets,例如:
--
-- PostgreSQL database dump
--
-- Dumped from database version 12.4 (Debian 12.4-1.pgdg100+1)
-- Dumped by pg_dump version 13.4 (Debian 13.4-4.pgdg100+1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
source 指定要转储的数据库的名称。通常这将是default,除非您在设置 Hasura 时更改它。
您得到的输出应该是一个 SET 语句,后跟一堆 INSERT INTO 语句。
这可以直接复制/粘贴到 Hasura 控制台的数据 > SQL 选项卡并运行以导入转储的数据。
参考/有用的链接
注意事项
我需要 pg_dump 作为种子数据,以便在 applying a Hasura migration 从旧实例到新 Hasura 实例时使用。但是(在我的例子中)Hasura CLI 在旧实例上的初始迁移输出包括一堆hdb_catalog create schema 语句,这将确保在将迁移应用到新的 Hasura 实例时失败。 (hdb_catalog 模式/表已经存在于新的/全新的 Hasura 安装中)
为了纠正这个问题,我需要在旧实例上 reset migrations 并重做迁移命令(如上述链接所示)。这个新的迁移输出不包括 hdb_catalog 架构,可以正常应用到新的 Hasura 实例。
然后我可以在新实例的 Hasura 控制台 SQL 选项卡/窗口中运行 pg_dump 输出来重新填充我的表。