【问题标题】:Batch file for reading sql scripts from file and export results to csv用于从文件中读取 sql 脚本并将结果导出到 csv 的批处理文件
【发布时间】:2021-11-24 23:17:27
【问题描述】:

我想制作一个批处理文件,该文件将从目录中的 .SQL 脚本获取查询并以 .csv 格式导出结果。我需要连接到 Postgres 服务器。

所以我正在尝试使用该答案https://stackoverflow.com/a/39049102/9631920 来做到这一点。 我的档案:

#!/bin/bash
# sql_to_csv.sh
echo test1
CONN="psql -U my_user -d my_db -h host -port"
QUERY="$(sed 's/;//g;/^--/ d;s/--.*//g;' 'folder/folder/folder/file.sql' | tr '\n' ' ')"
echo test2
echo "$QUERY"
echo test3
echo "\\copy ($QUERY) to 'folder/folder/folder/file.csv' with csv header" | $CONN > /dev/null
echo query in progress

它显示来自查询和 test3 的脚本,然后停止。我做错了什么?

编辑。 我的档案:

#!/bin/bash

PSQL = "psql -h 250.250.250.250 -p 5432 -U user -d test"

${PSQL} << OMG2

CREATE TEMP VIEW xyz AS
`cat C:\Users\test\Documents\my_query.sql`
        ;

\copy (select * from xyz) TO 'C:\Users\test\Documents\res.csv';

OMG2

但它没有询问密码,也没有得到任何结果文件

【问题讨论】:

  • 它现在正在读取和创建结果文件。但是结果文件是空的。不明白为什么,尝试了 3 个不同的脚本
  • folder/folder/folder/file.sql 中有什么内容?只有一个查询?
  • 复杂单选查询
  • 把它放到一个 TEMP 视图中并 `\copy (select * from the_view) TO 'the_file.csv'; (无需删除 cmets,或将所有内容放在一行中!)
  • 所以我需要为每个脚本创建临时视图?我认为这是不可能的,因为每次我都需要一个新的脚本来完成

标签: postgresql bash psql


【解决方案1】:
  • shell HERE 文档将解决您的大部分引用问题
  • 临时视图将解决单行查询问题

示例(使用多行两表 JOIN):


#!/bin/bash

PSQL="psql -U www twitters"

${PSQL} << OMG

        -- Some comment here
CREATE TEMP VIEW xyz AS
SELECT twp.name, twt.*
FROM tweeps twp
JOIN tweets twt
        ON twt.user_id = twp.id
        AND twt.in_reply_to_id > 3
WHERE 1=1
AND (False OR  twp.screen_name ilike '%omg%' )
        ;

\copy (select * from xyz) TO 'omg.csv';

OMG                     

如果您想要现有 .sql 文件的内容,可以使用反引号扩展将其放在此处的文档中:


#!/bin/bash

PSQL="psql -X -n -U www twitters"

${PSQL} << OMG2

        -- Some comment here
CREATE TEMP VIEW xyz AS
-- ... more comment
-- cat the original file here
`cat /home/dir1/dir2/dir3/myscript.sql`
        ;

\copy (select * from xyz) TO 'omg.csv';

OMG2

【讨论】:

  • CREATE TEMP VIEW xyz AS \i folder/folder/folder/file.sql?
  • 是的,但是在 HERE 文档中,并且在单独的一行中。
  • 抱歉,psql 不允许 \include 跨越语句边界。
  • 试图让它像你上次的编辑一样,但使用 .sh 文件无法得到任何结果。它正在 bash 中创建一些 postgress 命令并立即关闭它
  • 也许您错过了此处文档中的反引号? (在这里工作)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2021-08-12
相关资源
最近更新 更多