我正在尝试使用带有 psql 的 powershell 脚本在一次调用中将记录从一个数据库移动到另一个数据库。 select 查询结果被复制到 stdout,在第二个管道命令中用作插入查询的输入。 数据库位于不同的位置。源表和目标表具有相同的架构。
我尝试在本地使用 psql 和连接参数通过管道传输命令,它成功了,因为不需要更改数据库连接密码。
这是工作块:
$env:PGPASSWORD = 'local_pass';
# execute 2 queries in sequence
$res = & $psqlPath -U 'user' -d 'localMasterDB' -h $'local' `
-c "\copy (SELECT * FROM target_table WHERE id IN ( $idsToMove)) TO stdout" `
| & $psqlPath -U 'postgres' -d 'localReplicaDB' -h 'local' `
-c 'COPY target_table FROM stdin'
因为我需要不同的数据库连接,所以我必须定义2个不同的数据库密码。
这可以通过使用连接 URI 定义数据库连接来完成 (https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING-URIS)。
这是结果:
$res = "\copy (SELECT * FROM target_table WHERE id IN ( $idsToMove)) TO stdout" `
| & $psqlPath "postgresql://user:local_pass@master_db:5432/target_table" `
| 'COPY target_table FROM stdin' ` # <== this is where the second psql command should start
| & $psqlPath -U 'postgres' -d 'remote_db'
有没有办法通过管道传输 2 个使用数据库连接 uri 的 psql 命令?
还有其他类似的方法可以用psql实现移动记录吗?
您可以使用 pgpass.conf 文件存储多个主机的密码,如:
mkdir $env:APPDATA\postgresql\
edit $env:APPDATA\postgresql\pgpass.conf
然后添加以下格式的行:
hostname:port:database:username:password
之后,在执行 psql 时,这些密码将通过组合 -h '主机名' -U '用户名' -d '数据库' 来识别并应用。 因此,你的第一个命令将毫无问题地工作,利用它,就像
& $psqlPath -U 'user' -d 'localMasterDB' -h $local `
-c "\copy (SELECT * FROM target_table WHERE id IN ( $idsToMove)) TO stdout" |
& $psqlPath -U 'postgres' -d $remote_db -h $remote_host `
-c 'COPY target_table FROM stdin'
显示输出
COPY N
如需进一步参考pgpass 上的官方文档。