Автоматизация вывода PostgreSQL в CSV - PullRequest
0 голосов
/ 12 марта 2012
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-файлов

Так что моя цельсценарий заключается в том, чтобы в сценарии подключиться к базе данных, выполнить команды \ o etc, затем закрыть его

, но у меня возникли проблемы при написании сценария, например, перейти в базу данных psql arco и выполнить эти запросы.

командная строка для подключения к db = psql arco затем, как только распознаются сценарии, я нахожусь в этой базе данных, выполняйте эти команды для автоматизации запроса к CSV-файлу.

ifлюбой может заставить меня начать или направить меня к чтению материала, чтобы я смог преодолеть этот бит, это будет должным образом оценено.

Я запускаю все это со стандартного Windows XP, ssh'ing на набор SLESвеб-сервер, на котором хранится моя база данных postgresql под управлением psql версии 8.1.17

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

Прежде всего, вы должны исправить ваши настройки. Как оказалось, мы имеем дело с PostgreSQL 8.1 здесь. Эта версия достигла конца жизни в 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.

Подробная информация о psql в прекрасном руководстве.


Альтернативный подход, который должен работать с устаревшим PostgreSQL 8.1:

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

Найдите дополнительную информацию об этих параметрах командной строки в этом связанном вопросе на dba.SE .


С функцией (синтаксис совместим с 8.1)

Другим способом было бы создание серверной функции (если вы можете!), Которая выполняет COPY из временной таблицы (старый синтаксис - работает с pg 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;

А потом из оболочки:

psql arco -c 'SELECT f_copy_file()'

Заменить разделитель

\f устанавливает разделитель полей. Я цитирую руководство снова:

-F сепаратор --field-сепаратор = сепаратор * 1 046 *

Использовать разделитель в качестве разделителя полей для выровненного вывода. Это эквивалентно \ pset fieldsep или \ f.

Или вы можете изменить разделитель столбцов в Excel, вот инструкции от MS .

1 голос
/ 13 марта 2012

Благодаря помощи Эрвина и ссылке, которую я прочитал, он разместил для меня сообщение, и мне удалось объединить два, чтобы получить

#!/bin/sh

dbname='arco'
username=''   # If you actually supply a username, you need to add the -U switch!
psql $dbname $username << EOF
\f ,
\o /h/u544835/showme.csv
SELECT * FROM storage;
EOF

, который запишет мои запросы в файл CSV и т. Д. Для меня.

Из того, что есть выше, он не отделяет SQL-запрос, поэтому, если я загружаю его прямо в Excel, все они остаются в одном столбце, что означает, что у меня проблема с разделителем

Я пробовал разделители с вкладками, также пробовал;и т. д., но никто не позволяет мне отделить его, мне нужно, есть ли вариант, я могу нажать, чтобы увидеть, какой разделитель используется с моим PSQL?или другой способ выгрузки данных из запроса в файл, который может быть прочитан в Excel, поэтому для каждой строки есть разные столбцы и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...