将PostgreSQL输出自动化为csv

时间:2012-03-12 11:52:47

标签: postgresql

mohpc04pp1: /h/u544835 % psql arco
Welcome to psql 8.1.17, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
   \h for help with SQL commands
   \? for help with psql commands
   \g or terminate with semicolon to execute query
   \q to quit

WARNING:  You are connected to a server with major version 8.3,
but your psql client is major version 8.2.  Some backslash commands,
such as \d, might not work properly.

dbname=> \o /h/u544835/data25000.csv
dbname=> select url from urltable where scoreid=1 limit 25000;
dbname=> \q

这是从网上链接中获取的,基本上是我一直在做的,但我需要做的是制作一个脚本,我可以用来每天生成csv文件

所以我的脚本目标是在脚本中连接到db,运行\ o etc命令然后关闭它

但我在编写脚本时遇到问题,请说进入psql arco数据库然后运行这些查询。

命令行连接到db = psql arco 然后一旦scrits识别出我在那个数据库中执行那些命令来自动查询到csv文件。

如果有人能让我开始或者指点我阅读材料让我过去那一点,我们将非常感激。

我正在运行所有这些标准的Windows XP,ssh'ing到SLES设置的Web服务器,它保存我的postgresql数据库运行psql版本8.1.17

1 个答案:

答案 0 :(得分:2)

首先,您应该修复您的设置。事实证明,我们在这里处理PostgreSQL 8.1。此版本有reached end of live in 2010。您需要认真考虑升级 - 或者至少提醒运行服务器的人。当前版本是9.1。

您正在寻找的命令:

psql arco -c "\copy (select url from urltable where scoreid=1 limit 25000) to '/h/u544835/data25000.csv'"

假设您的数据库名为“arco”。调整已更改的问题(包括更改的端口)。

我现在看到你的问题中出现了版本8.1,但这一切都是矛盾的。您需要Postgres 8.2或更高版本来使用\copy元命令的查询(而不是表格)。

Details about psql in the fine manual.


应该使用过时的PostgreSQL 8.1的替代方法:

psql arco -o /h/u544835/data25000.csv -t -A -c 'SELECT url FROM urltable WHERE scoreid = 1 LIMIT 25000'

在此related question on dba.SE下找到有关这些命令行选项的更多信息。


具有功能(语法与8.1兼容)

另一种方法是创建一个服务器端函数(如果可以!),从临时表执行COPY(旧语法 - 适用于第8.1页):

CREATE OR REPLACE FUNCTION f_copy_file()
  RETURNS void AS
$BODY$
BEGIN

CREATE TEMP TABLE u_tmp AS (
    SELECT url FROM urltable WHERE scoreid = 1 LIMIT 25000
    );

COPY u_tmp TO '/h/u544835/data25000.csv';

DROP TABLE u_tmp;

END;
$BODY$
  LANGUAGE plpgsql;

然后从shell开始:

psql arco -c 'SELECT f_copy_file()'

更改分隔符

\f设置字段分隔符。我再次引用手册:

  

-F分隔符   --field分离器分离器=

     

使用separator作为未对齐输出的字段分隔符。   这相当于\ pset fieldsep或\ f。

或者您可以在Excel中更改列分隔符,这里是instructions from MS