将PostgreSQL的PL/pgSQL输出保存到CSV文件

将PostgreSQL的PL/pgSQL输出保存到CSV文件,sql,postgresql,csv,postgresql-copy,Sql,Postgresql,Csv,Postgresql Copy,将PostgreSQL数据库的PL/pgSQL输出保存到CSV文件的最简单方法是什么 我正在使用PostgreSQL 8.4和pgAdmin III以及PSQL插件来运行查询。PSQL可以为您做到这一点: edd@ron:~$ psql -d beancounter -t -A -F"," \ -c "select date, symbol, day_close " \ "from stockprices where symb

将PostgreSQL数据库的PL/pgSQL输出保存到CSV文件的最简单方法是什么


我正在使用PostgreSQL 8.4和pgAdmin III以及PSQL插件来运行查询。

PSQL
可以为您做到这一点:

edd@ron:~$ psql -d beancounter -t -A -F"," \
                -c "select date, symbol, day_close " \
                   "from stockprices where symbol like 'I%' " \
                   "and date >= '2009-10-02'"
2009-10-02,IBM,119.02
2009-10-02,IEF,92.77
2009-10-02,IEV,37.05
2009-10-02,IJH,66.18
2009-10-02,IJR,50.33
2009-10-02,ILF,42.24
2009-10-02,INTC,18.97
2009-10-02,IP,21.39
edd@ron:~$

有关此处使用的选项的帮助,请参见
man psql

您希望生成的文件在服务器上还是在客户端上

服务器端 如果您想要一些易于重用或自动化的东西,可以使用Postgresql的内置命令。e、 g

Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;
这种方法完全在远程服务器上运行-它不能写入本地PC。它还需要作为Postgres的“超级用户”(通常称为“root”)运行,因为Postgres无法阻止它在该机器的本地文件系统上做令人讨厌的事情

这并不意味着你必须以超级用户的身份连接(自动化这将是另一种安全风险),因为你可以使用它来创建一个运行起来就像你是超级用户一样的函数

关键的一点是,你的函数在那里执行额外的检查,而不仅仅是绕过安全性——因此你可以编写一个函数来导出你需要的确切数据,或者你可以编写一些可以接受各种选项的东西,只要它们符合严格的白名单。您需要检查两件事:

  • 应允许用户在磁盘上读/写哪些文件?例如,这可能是一个特定的目录,文件名可能必须具有合适的前缀或扩展名
  • 用户应该能够在数据库中读/写哪些表?这通常由数据库中的
    GRANT
    s定义,但该函数现在以超级用户的身份运行,因此通常“超出范围”的表将完全可访问。您可能不希望有人调用您的函数并在“users”表的末尾添加行
  • 我已经写过,包括一些导出(或导入)满足严格条件的文件和表的函数示例


    客户端 另一种方法是在客户端执行文件处理,即在应用程序或脚本中。Postgres服务器不需要知道您要复制到哪个文件,它只需吐出数据,然后客户端将其放在某个地方

    它的基本语法是
    复制到STDOUT
    命令,像pgAdmin这样的图形工具将把它包装在一个漂亮的对话框中

    psql
    命令行客户端
    有一个名为
    \copy
    的特殊“元命令”,它采用与“real”
    copy
    相同的所有选项,但在客户端内部运行:

    \copy (Select * From foo) To '/tmp/test.csv' With CSV
    
    注意,没有终止
    ,因为元命令与SQL命令不同,由换行符终止

    发件人:

    不要将COPY与psql指令\COPY混淆\copy调用copy FROM STDIN或copy TO STDOUT,然后在psql客户机可访问的文件中获取/存储数据。因此,使用\copy时,文件可访问性和访问权限取决于客户端而不是服务器


    您的应用程序编程语言可能还支持推送或获取数据,但通常不能在标准SQL语句中使用
    COPY FROM STDIN
    /
    TO STDOUT
    ,因为无法连接输入/输出流。PHP的PostgreSQL处理程序(不是PDO)包括非常基本的和从PHP数组复制的函数,这对于大型数据集可能不太有效。

    在pgAdmin III中,有一个从查询窗口导出到文件的选项。在主菜单中,它是Query->executetofile,或者有一个按钮做同样的事情(它是一个带蓝色软盘的绿色三角形,而不是只运行查询的纯绿色三角形)。如果您没有从查询窗口运行查询,那么我会按照IMSoP的建议执行,并使用copy命令。

    在终端(连接到db时)中,将输出设置为cvs文件

    1) 将字段分隔符设置为“
    ”,”

    \f ','
    
    2) 将输出格式设置为未对齐:

    \a
    
    3) 仅显示元组:

    \t
    
    4) 设置输出:

    \o '/tmp/yourOutputFile.csv'
    
    5) 执行您的查询:

    :select * from YOUR_TABLE
    
    6) 输出:

    然后,您将能够在以下位置找到您的csv文件:

    cd /tmp
    
    使用
    scp
    命令复制或使用nano编辑:

    nano /tmp/yourOutputFile.csv
    

    有几种解决方案:

    1
    psql
    命令
    psql-d dbname-t-A-F“,“-c”从用户中选择*”>output.csv

    这有一个很大的优势,您可以通过SSH使用它,比如
    SSHpostgres@host命令
    -使您能够

    2个postgres
    copy
    命令
    使用csv将(从用户处选择*)复制到“/tmp/output.csv”

    3 psql交互式(或非交互式) 它们都可以在脚本中使用,但我更喜欢#1

    4 pgadmin,但这是不可编写脚本的。如果您对特定表的所有列以及标题感兴趣,可以使用

    COPY table TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
    
    这比以前简单一点

    COPY (SELECT * FROM table) TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
    

    据我所知,这是等效的。

    我正在使用AWS红移,它不支持
    复制到
    功能

    不过,我的BI工具支持以制表符分隔的CSV,因此我使用了以下方法:

    psql-h dblocation-p port-U user-d dbname-F$'\t'-no align-c“从表中选择”>outfile.csv
    
    ,web浏览器中的一个数据库客户端,使这变得非常简单。尤其是你在Heroku的时候

    它允许您连接到远程数据库并对其运行SQL查询


    (来源:)


    连接数据库后,可以运行查询并导出为CSV或TXT(见右下角)



    注意:我与JackDB没有任何关系。我目前使用他们的免费服务,认为这是一个很棒的产品。

    我不得不使用\COPY,因为我收到了错误消息:

    ERROR:  could not open file "/filepath/places.csv" for writing: Permission denied
    
    所以我用了:

    \Copy (Select address, zip  From manjadata) To '/filepath/places.csv' With CSV;
    
    而且它正在运行

    ERROR: could not open file "/filepath/places.csv" for writing: Permission denied

    \Copy (Select address, zip  From manjadata) To '/filepath/places.csv' With CSV;
    
    psql -d my_db_name -t -A -F";" -f input-file.sql -o output-file.csv
    
    psql2csv [OPTIONS] < QUERY
    psql2csv [OPTIONS] QUERY
    
    import json
    cursor = conn.cursor()
    qry = """ SELECT details FROM test_csvfile """ 
    cursor.execute(qry)
    rows = cursor.fetchall()
    
    value = json.dumps(rows)
    
    with open("/home/asha/Desktop/Income_output.json","w+") as f:
        f.write(value)
    print 'Saved to File Successfully'
    
    psql -d dbame -U username \
      -c "COPY ( SELECT * FROM TABLE ) TO STDOUT WITH CSV HEADER " > \
      OUTPUT_CSV_FILE.csv
    
    COPY (select id, name from groups) TO STDOUT WITH CSV HEADER
    
    $ ssh psqlserver.example.com 'psql -d mydb "COPY (select id, name from groups) TO STDOUT WITH CSV HEADER"' > groups.csv
    
    $ ssh pgserver.example.com 'docker exec -tu postgres postgres psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
    
    $ psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
    
    docker exec -tu postgres postgres psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
    
    kubectl exec -t postgres-2592991581-ws2td 'psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
    
    $ psql -P pager=off -d mydb -t -A -F',' -c 'select * from groups;'
    2,Technician,Test 2,,,t,,0,,                                                                                                                                                                   
    3,Truck,1,2017-10-02,,t,,0,,                                                                                                                                                                   
    4,Truck,2,2017-10-02,,t,,0,,
    
    Copy (Select * From tableName) To '/tmp/fileName.csv' With CSV HEADER;