Postgres Java 客户端可以将 COPY 查询写入本地硬盘吗?

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

我有两个 Docker 容器。一种是运行 Spring Boot 应用程序。另一个正在运行 Postgres。

我正在尝试以可以导入 pandas 的格式从 Postgres 获取三个表到 Java 服务器上(CSV,很可能?),但我遇到了困难。

我无法使用 ProcessBuilder 运行 pg_dump 或 psql,因为它们在 Java 映像中不可用。

我知道有一种方法可以使用安装在主机上的 docker 可执行文件和套接字,但这是一个后勤问题,因为许多现有服务器已经配置。最好在代码中解决这个问题,而无需更改操作系统或 docker-compose.yml。

我以为我可以使用 Postgres COPY 查询,但它似乎是将文件写入 Postgres 容器的硬盘驱动器,而不是 Java 容器的硬盘驱动器。

有什么方法(scp?ftp?)将复制的文件从一个容器传输到另一个容器吗?

也许两个容器之间的共享卷可以工作,但这需要手动编辑所有已部署服务器的 docker-compose.yml。

如何仅使用 Java 代码将这些表的 CSV 转储(或任何其他 pandas 友好的格式)从 Postgres 容器转移到 Java 容器?

java postgresql docker docker-compose pg-dump
1个回答
0
投票

事实证明,COPY 查询可用于将数据获取到客户端。您指定 STDOUT,而不是文件。请注意,您必须使用 CopyManager 而不是 Statement。

import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;

        CopyManager copyManager = new CopyManager(connection.unwrap(BaseConnection.class));

        try (PrintWriter writer = new PrintWriter(new FileWriter(filePath))) {
            copyManager.copyOut("COPY " + tableName + " TO STDOUT WITH (FORMAT CSV, HEADER)", writer);
        }
© www.soinside.com 2019 - 2024. All rights reserved.