我想从 HasuraDB 中将我的数据 pg_dump 到本地机器,有什么推荐的方法吗?
我想从 HasuraDB 中将我的数据 pg_dump 到本地机器,有什么推荐的方法吗?
选项1:
在您的Postgres容器上执行pg_dump
命令:
pg_dump -U username -d dbname > data.sql
实际上,您可能只需要数据而不是hasura元数据或schema_migration信息。这是一种更好的“数据导出”类型命令:
pg_dump -U username -d dbname --data-only --schema public > data.sql
选项2:
如果Postgres正在作为Docker容器运行:
# Exec into the postgres container
$ docker exec -ti <postgres-id> -- /bin/bash
# Run pg_dump
root@postgres-3391217220-t7bbc:/$ pg_dump -U postgres -d postgres --data-only --schema public > db.sql
^D
# Back on your local machine, copy the dump
$ docker cp <postgres-id>:/db.sql db.sql
Hasura默认启用了pgdump
API命令。以下是文档链接:https://docs.hasura.io/1.0/graphql/manual/api-reference/pgdump.html
但该文档目前缺少示例。以下是我使用的一个示例,用于转储Hasura数据(不包括模式,因为模式来自迁移),以便将其导入到本地托管的开发环境中(如果有必要,请插入您自己的hasura-admin-secret
或替换其他标头):
HASURA_SECRET=som3_Secr3t_Her3
curl -d '{"-Fc", "opts": ["--data-only"]}' -H "x-hasura-admin-secret: $HASURA_SECRET" https://your-host-url.com/v1alpha1/pg_dump > dumpfile
opts
数组中未能成功传递-Fc
选项(Hasura返回 { "path": "$", "error": "internal exception while executing pg_dump", "code": "unexpected" }
)。谢谢,ptim - ptim-Fc
/ --format custom
后问题得到了解决。我猜测这是因为Hasura的PostgreSQL客户端安装版本与PostgreSQL数据库不同。为了让此选项正常工作,需要相匹配的主要版本。 - Lars Blumberg要从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
添加了一个 JSON 格式的请求体给 pg_dump 和 Hasura 的端点处理程序中的选项 ("opts"):
{
"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语句和注释,例如:
--
-- 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 控制台的 Data > SQL 标签页中并运行以导入已转储的数据。
我需要将 pg_dump 作为种子数据使用,当从旧实例迁移到新的 Hasura 实例时,用于应用 Hasura 迁移。但是,(在我的情况下)Hasura CLI 在旧实例上生成的初始迁移包括一堆 hdb_catalog
创建模式语句,这将确保在新的 Hasura 实例上应用迁移时失败。(hdb_catalog 模式/表已经存在于新/干净的 Hasura 安装中)
为了纠正这个问题,我需要在旧实例上重置迁移,然后重新执行迁移命令(如上述链接所示)。这个新的迁移输出不包括 hdb_catalog 模式,可以顺利地应用到新的 Hasura 实例。
然后我只需在新实例的 Hasura 控制台 SQL 标签页/窗口中运行 pg_dump 输出以重新填充我的表格。