PostgreSQL中快速导出自定义域至目标数据库的方法咨询
快速导出PostgreSQL自定义域到目标库的方法
用pg_dump精准导出域,跳过其他schema对象
不用全量导出schema,pg_dump支持直接只导出域对象,速度快很多:
pg_dump -U 用户名 -d 源数据库名 -n public --schema-only -t '*.domain' > domains.sql
这里的*.domain是pg_dump的特殊匹配规则,专门匹配所有自定义域。如果你的域不在public模式,把-n public换成对应的模式名就行,多个模式的话用-n 'schema1,schema2'。
导出后直接在目标库恢复:
psql -U 用户名 -d 目标数据库名 -f domains.sql
直接查系统表生成创建语句,速度拉满
要是pg_dump的方法还嫌慢,直接查PostgreSQL的系统表生成域的创建SQL,这是最快的方式:
在源数据库执行这条SQL:
SELECT format( 'CREATE DOMAIN %I.%I AS %s%s;', n.nspname, d.typname, pg_catalog.format_type(d.typbasetype, d.typtypmod), CASE WHEN d.typnotnull THEN ' NOT NULL' ELSE '' END || COALESCE(' CHECK (' || pg_get_constraintdef(c.oid) || ')', '') ) AS create_domain_stmt FROM pg_catalog.pg_type d JOIN pg_catalog.pg_namespace n ON d.typnamespace = n.oid LEFT JOIN pg_catalog.pg_constraint c ON c.contypid = d.oid AND c.contype = 'c' WHERE d.typtype = 'd';
把查询结果里的create_domain_stmt列内容全部复制出来,存成SQL文件,去目标库执行就行。这条查询会自动拉取所有模式下的自定义域,包括非空约束和检查约束。
后续操作
先把域恢复到目标库,再用你之前pg_dump -t导出的表数据恢复,就不会再报缺少域的错误了。
内容的提问来源于stack exchange,提问作者Antonin
相关产品推荐
相关产品推荐

