使用 Postgres JDBC 恢复数据库中的 postgres 备份数据(数据库名称包含空格)

Posted

技术标签:

【中文标题】使用 Postgres JDBC 恢复数据库中的 postgres 备份数据(数据库名称包含空格)【英文标题】:Restore postgres Backup Data in DB (DB name contain spaces) using Postgres JDBC 【发布时间】:2020-11-24 10:23:19 【问题描述】:

我们正在尝试将备份文件恢复到数据库名称包含空格的 postgres 数据库。例如:“abbb abc”、“dqweqwe fdf fsdf”、... 但是在恢复未显示在该数据库名称中的数据后(由 pgAdmin 工具检查)。 以下是我们的备份恢复 java 命令:

   String host = "localhost";
   String port = "5432";
   String databaseName = "abc    abc    "; 
   String user = "postgres";
   String backupFilePath= "C:\Users\Sun\Desktop\backup.backup";

   final String RESTORE_COMMAND = "pg_restore -c -h %s -p %s -U %s -d %s -v %s";
   String cmd = String.format(RESTORE_COMMAND, host, port, user, databaseName, backupFilePath);
   // Execute commands by  Runtime.getRuntime().exec(cmd )
   excuteCommand(cmd);

我们尝试使用一些转义字符串,如 "" 或 '' 或 [] ,甚至用 \ 替换 databaseName 中的空格,但它还没有奏效。 这些对我们来说有什么建议吗?请帮忙,非常感谢。

【问题讨论】:

您可能需要考虑使用正确填充的字符串数组而不是 Runtime.exec(String) 调用 Runtime.getRuntime().exec(String[]) 是的,用于执行恢复的命令保证正确 【参考方案1】:

尝试引用您的数据库名称如下:'"databasename"' 所以java变量应该是这样的:

   String databaseName = "'\"abc    abc\"'";

【讨论】:

我刚刚尝试了您的评论,但没有成功。你对我还有什么建议吗?谢谢 你能从psql客户端执行sql命令:select * from pg_catalog.pg_database;\l+吗?我确定该数据库存在,但 UI 工具无法显示它 是的,如果我在窗口命令行中执行此命令,通过使用引号 \" 来包装数据库名称,它可以完美地工作,但它不适用于 java,我不知道如何:( 你为什么用and单引号和双引号?选择一个 我尝试了单引号或双引号或将它们结合起来但没有工作@Mark Rotteveel

以上是关于使用 Postgres JDBC 恢复数据库中的 postgres 备份数据(数据库名称包含空格)的主要内容,如果未能解决你的问题,请参考以下文章

IntegrityError:postgres 从转储恢复后,所有具有 ForeignKey 的模型/字段的“id”列中的空值

JDBC 将我的 postgres 查询中的表大写

Android 无法直接连接 Postgres 数据库,也无法使用 JDBC 连接

如何通过 Spark 中的 jdbc 连接到 docker 托管的 postgresql 数据库?

只允许通过 sql server、oracle 和 postgres 中的 jdbc 更新表

(Pyspark 使用 JDBC 写入 postgres 失败并出现 NullPointerException