使用 DB uri 的 Powershell 管道 psql 命令

问题描述 投票:0回答:1

我正在尝试使用带有 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实现移动记录吗?

postgresql powershell database-connection psql
1个回答
0
投票

您可以使用 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 上的官方文档

© www.soinside.com 2019 - 2024. All rights reserved.