【问题标题】:Writing the output of sql query to a file将sql查询的输出写入文件
【发布时间】:2011-10-14 10:48:37
【问题描述】:

我有一个 SQL 查询:

SELECT 'DROP TABLE ' || tablename
  FROM pg_catalog.pg_tables where tablename like 'r_395%';

谁的输出是这样的:

?column?      
--------------------
 DROP TABLE r_395_0
 DROP TABLE r_395_1
 DROP TABLE r_395_2
 DROP TABLE r_395_3
 DROP TABLE r_395_4
 DROP TABLE r_395_5
 DROP TABLE r_395_6
 DROP TABLE r_395_7
 DROP TABLE r_395_8
 DROP TABLE r_395_9
(10 rows)

我正在使用实体管理器来执行这个查询:

StringBuffer query = new StringBuffer();

query.append("SELECT 'DROP TABLE ' || tablename
                FROM pg_catalog.pg_tables where tablename like 'r_395%'");            
entityManager.createNativeQuery(query.toString()).executeUpdate();

我想将此输出写入文件。如果它只是一个文本文件,我会使用文件写入器和缓冲写入器。但是现在它是一个SQL生成的文件,我有点困惑。有没有办法在 Java 中实现这一点?

【问题讨论】:

  • 数据来源不重要。听起来输出文件确实是一个文本文件。
  • 是的,特洛伊木马是对的。您只需将数据写入文本文件即可。

标签: java postgresql file-io postgresql-copy


【解决方案1】:

如果你想在本地(在数据库的机器上)写一个文件,还有一个非常快速和简单的COPY 用于这样的情况:

COPY $$SELECT 'DROP TABLE ' || tablename
         FROM pg_catalog.pg_tables
        WHERE tablename ~~ 'r_395%'$$ TO /path/to/myfile;

我在这里使用dollar-quoting,以避免转义单引号。

【讨论】:

    【解决方案2】:

    使用 SQL COPY 的一个非常相似的解决方案(参见 Erwin Brandstetter 的答案)是使用 psql meta command\copy。这里的区别是您不需要对数据库框进行本地访问。 SQL COPY 的输出只能写入数据库框上系统用户 postgres 具有写入权限的位置。使用 psql \copy 您可以将输出写入客户端上的某个位置。

    用psql连接数据库并执行命令

    psql -h host -p port -U user database
    \copy (SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables WHERE tablename ~~ 'r_395%') to '/path/to/myfile'
    

    或者用-c参数直接把命令传给psql:

    psql -h host -p port -U user -c "\copy (SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables WHERE tablename ~~ 'r_395%') to '/path/to/myfile'" database
    

    HTH

    【讨论】:

    • 你也可以使用\o来设置psql的输出文件,真的很容易做到。
    猜你喜欢
    • 2021-09-12
    • 1970-01-01
    • 2011-09-01
    • 2021-02-07
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多