首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >psql -读取SQL文件并输出到CSV

psql -读取SQL文件并输出到CSV
EN

Stack Overflow用户
提问于 2016-08-19 20:04:46
回答 4查看 4.2K关注 0票数 3

我有一个SQL文件my_query.sql

代码语言:javascript
复制
select * from my_table

使用psql,我可以在这个sql文件中读取:

\i my_query.sql

或者把它当作艺术品传进来:

psql -f my_query.sql

我可以将查询字符串的结果输出到csv:

\copy (select * from my_table) to 'output.csv' with csv header

是否有一种方法将它们组合在一起,以便我可以将查询结果从SQL文件输出到CSV?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-19 23:46:58

不幸的是,没有这方面的功能,所以您需要一些bash才能使它正常工作。

代码语言:javascript
复制
CONN="psql -U my_user -d my_db"
QUERY="$(sed 's/;//g;/^--/ d;s/--.*//g;' my_query.sql | tr '\n' ' ')"

echo "\\copy ($QUERY) to 'out.csv' with CSV HEADER" | $CONN

sed乐趣移除所有分号、注释行和行尾注释,tr将换行符转换为空格(如@abelisto的注释中提到的):

代码语言:javascript
复制
-- my_query.sql
select *
from my_table
where timestamp < current_date -- only want today's records
limit 10;

变成:

代码语言:javascript
复制
select * from my_table where timestamp < current_date limit 10

然后将其传递给有效的psql命令:

代码语言:javascript
复制
\copy (select * from my_table where timestamp < current_date) to 'out.csv' with csv header

下面是一个脚本:

sql_to_csv.sh

代码语言:javascript
复制
#!/bin/bash
# sql_to_csv.sh

CONN="psql -U my_user -d my_db"
QUERY="$(sed 's/;//g;/^--/ d;s/--.*//g;' $1 | tr '\n' ' ')"
echo "$QUERY"

echo "\\copy ($QUERY) to '$2' with csv header" | $CONN > /dev/null

./sql_to_csv.sh my_query.sql out.csv

票数 5
EN

Stack Overflow用户

发布于 2021-03-04 17:53:29

我认为最简单的方法是利用shell的可变扩展功能:

代码语言:javascript
复制
psql -U my_user -d my_db -c "COPY ($(cat my_query.sql)) TO STDOUT WITH CSV HEADER" > my_query_results.csv
票数 2
EN

Stack Overflow用户

发布于 2016-08-19 21:02:04

您可以使用bash脚本来完成它。

dump_query_to_csv.sh:

代码语言:javascript
复制
#!/bin/bash

# Takes an sql query file as an argument and dumps its results
# to a CSV file using psql \copy command.
#
# Usage:
#
#  dump_query_to_csv.sh <sql_query_file> [<csv_output_filesname>]

SQL_FILE=$1
[ -z $SQL_FILE ] && echo "Must supply query file" && exit
shift

OUT_FILE=$1
[ -z $OUT_FILE ] && OUT_FILE="output.csv" # default to "output.csv" if no argument is passed

TMP_TABLE=ttt_temp_table_xx # some table name that will not collide with existing tables

## Build a psql script to do the work
PSQL_SCRIPT=temp.psql

# create a temporary database table using the SQL from the query file
echo "DROP TABLE IF EXISTS $TMP_TABLE;CREATE TABLE $TMP_TABLE AS" > $PSQL_SCRIPT
cat $SQL_FILE >> $PSQL_SCRIPT
echo ";" >> $PSQL_SCRIPT

# copy the temporary table to the output CSV file
echo "\copy (select * from $TMP_TABLE) to '$OUT_FILE' with csv header" >> $PSQL_SCRIPT

# drop the temporary table
echo "DROP TABLE IF EXISTS $TMP_TABLE;" >> temp.sql

## Run psql script using psql
psql my_database < $PSQL_SCRIPT # replace my_database and add user login credentials as necessary

## Remove the psql script
rm $PSQL_SCRIPT

您需要编辑脚本中的psql行才能连接到数据库。还可以对脚本进行增强,以便将数据库和帐户凭据作为参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39046908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档