Respostas:
Deseja o arquivo resultante no servidor ou no cliente?
Se você quiser algo fácil de reutilizar ou automatizar, use o comando COPY incorporado do Postgresql . por exemplo
Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;
Essa abordagem é executada inteiramente no servidor remoto - não pode gravar no seu PC local. Ele também precisa ser executado como um "superusuário" do Postgres (normalmente chamado de "root") porque o Postgres não pode impedi-lo de fazer coisas desagradáveis com o sistema de arquivos local dessa máquina.
Na verdade, isso não significa que você precisa estar conectado como superusuário (automatizar isso seria um risco de segurança de um tipo diferente), porque você pode usar a SECURITY DEFINER
opçãoCREATE FUNCTION
para criar uma função que é executada como se você fosse um superusuário .
A parte crucial é que sua função existe para executar verificações adicionais, não apenas ignorando a segurança - para que você possa escrever uma função que exporte os dados exatos necessários ou para escrever algo que aceite várias opções, desde que conheça uma lista de permissões rigorosa. Você precisa verificar duas coisas:
GRANT
s no banco de dados, mas a função agora está sendo executada como um superusuário, para que as tabelas que normalmente seriam "fora dos limites" fiquem totalmente acessíveis. Você provavelmente não deseja permitir que alguém invoque sua função e adicione linhas no final da sua tabela de "usuários" ...Eu escrevi um post de blog expandindo essa abordagem , incluindo alguns exemplos de funções que exportam (ou importam) arquivos e tabelas que atendem a condições estritas.
A outra abordagem é fazer o tratamento de arquivos no lado do cliente , ou seja, no seu aplicativo ou script. O servidor do Postgres não precisa saber para qual arquivo você está copiando, apenas expõe os dados e o cliente os coloca em algum lugar.
A sintaxe subjacente a isso é o COPY TO STDOUT
comando, e ferramentas gráficas como o pgAdmin o envolverão em uma boa caixa de diálogo.
O psql
cliente da linha de comando possui um "meta-comando" especial chamado \copy
, que aceita as mesmas opções do "real" COPY
, mas é executado dentro do cliente:
\copy (Select * From foo) To '/tmp/test.csv' With CSV
Observe que não há finalização ;
, porque os meta-comandos são finalizados por nova linha, diferente dos comandos SQL.
Dos documentos :
Não confunda COPY com a instrução psql \ copy. \ copy chama COPY FROM STDIN ou COPY TO STDOUT e, em seguida, busca / armazena os dados em um arquivo acessível ao cliente psql. Portanto, a acessibilidade do arquivo e os direitos de acesso dependem do cliente e não do servidor quando \ copy é usado.
A linguagem de programação do aplicativo também pode ter suporte para enviar ou buscar dados, mas geralmente não é possível usar COPY FROM STDIN
/ TO STDOUT
dentro de uma instrução SQL padrão, porque não há como conectar o fluxo de entrada / saída. O manipulador PostgreSQL do PHP ( não PDO) inclui funções muito básicas pg_copy_from
e pg_copy_to
que copiam para / de uma matriz PHP, o que pode não ser eficiente para grandes conjuntos de dados.
\copy
funciona também - lá, os caminhos são relativos ao cliente e nenhum ponto e vírgula é necessário / permitido. Veja minha edição.
\copy
precisa ser uma linha. Assim, você não terá a beleza de formatar o sql da maneira que desejar e apenas de colocar uma cópia / função em torno dele.
\copy
é um meta-comando especial no psql
cliente da linha de comando . Não funcionará em outros clientes, como pgAdmin; eles provavelmente terão suas próprias ferramentas, como assistentes gráficos, para realizar este trabalho.
Existem várias soluções:
psql
comandopsql -d dbname -t -A -F"," -c "select * from users" > output.csv
Isso tem a grande vantagem de poder usá-lo via SSH, como ssh postgres@host command
- permitindo que você obtenha
copy
Comando 2 postgresCOPY (SELECT * from users) To '/tmp/output.csv' With CSV;
>psql dbname
psql>\f ','
psql>\a
psql>\o '/tmp/output.csv'
psql>SELECT * from users;
psql>\q
Todos eles podem ser usados em scripts, mas eu prefiro o número 1.
No terminal (enquanto conectado ao db), defina a saída para o arquivo cvs
1) Defina o separador de campo como ','
:
\f ','
2) Defina o formato de saída desalinhado:
\a
3) Mostrar apenas tuplas:
\t
4) Definir saída:
\o '/tmp/yourOutputFile.csv'
5) Execute sua consulta:
:select * from YOUR_TABLE
6) Saída:
\o
Você poderá encontrar seu arquivo csv neste local:
cd /tmp
Copie-o usando o scp
comando ou edite-o usando o nano:
nano /tmp/yourOutputFile.csv
COPY
ou são \copy
tratadas corretamente (converta para o formato CSV padrão); faz isso?
Se você estiver interessado em todas as colunas de uma tabela específica, juntamente com os cabeçalhos, poderá usar
COPY table TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
Isso é um pouco mais simples do que
COPY (SELECT * FROM table) TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
que, até onde sei, são equivalentes.
Esta informação não está realmente bem representada. Como esta é a segunda vez que eu preciso derivar isso, vou colocar isso aqui para me lembrar, se nada mais.
Realmente, a melhor maneira de fazer isso (tirar o CSV do postgres) é usar o COPY ... TO STDOUT
comando Embora você não queira fazê-lo da maneira mostrada nas respostas aqui. A maneira correta de usar o comando é:
COPY (select id, name from groups) TO STDOUT WITH CSV HEADER
É ótimo para uso em ssh:
$ ssh psqlserver.example.com 'psql -d mydb "COPY (select id, name from groups) TO STDOUT WITH CSV HEADER"' > groups.csv
É ótimo para uso dentro do docker sobre ssh:
$ ssh pgserver.example.com 'docker exec -tu postgres postgres psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
É ótimo na máquina local:
$ psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
Ou dentro da janela de encaixe na máquina local ?:
docker exec -tu postgres postgres psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
Ou em um cluster kubernetes, na janela de encaixe, sobre HTTPS ??:
kubectl exec -t postgres-2592991581-ws2td 'psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
Tão versátil, muitas vírgulas!
Sim, fiz, aqui estão minhas anotações:
Usar /copy
efetivamente executa operações de arquivo em qualquer sistema em que o psql
comando esteja sendo executado, como o usuário que o está executando 1 . Se você se conectar a um servidor remoto, é simples copiar arquivos de dados no sistema executando psql
para / do servidor remoto.
COPY
executa operações de arquivo no servidor como a conta de usuário do processo de back-end (padrão postgres
), os caminhos e as permissões de arquivo são verificados e aplicados de acordo. Se estiver usando TO STDOUT
, as verificações de permissões de arquivo serão ignoradas.
Ambas as opções requerem movimentação de arquivo subsequente se psql
não estiver em execução no sistema em que você deseja que o CSV resultante resida. Este é o caso mais provável, na minha experiência, quando você trabalha principalmente com servidores remotos.
É mais complexo configurar algo como um túnel TCP / IP sobre ssh em um sistema remoto para saída CSV simples, mas para outros formatos de saída (binários) pode ser melhor passar /copy
por uma conexão em túnel, executando um local psql
. Da mesma forma, para grandes importações, mover o arquivo de origem para o servidor e usá-lo COPY
é provavelmente a opção de maior desempenho.
Com os parâmetros psql, você pode formatar a saída como CSV, mas há desvantagens como lembrar de desativar o pager e não obter cabeçalhos:
$ 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,,
Não, eu só quero tirar o CSV do meu servidor sem compilar e / ou instalar uma ferramenta.
psql
pode fazer isso por você:
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:~$
Consulte man psql
para obter ajuda sobre as opções usadas aqui.
Nova versão - psql 12 - será suportada --csv
.
--csv
Muda para o modo de saída CSV (valores separados por vírgula). Isso é equivalente ao formato \ pset csv .
csv_fieldsep
Especifica o separador de campos a ser usado no formato de saída CSV. Se o caractere separador aparecer no valor de um campo, esse campo será gerado entre aspas duplas, seguindo as regras CSV padrão. O padrão é uma vírgula.
Uso:
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv -P csv_fieldsep='^' postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres > output.csv
No pgAdmin III, há uma opção para exportar para o arquivo da janela de consulta. No menu principal, é Consulta -> Executar para arquivar ou existe um botão que faz a mesma coisa (é um triângulo verde com um disquete azul em oposição ao triângulo verde liso que apenas executa a consulta). Se você não estiver executando a consulta na janela de consulta, eu faria o que o IMSoP sugeriu e usaria o comando copy.
Eu escrevi uma pequena ferramenta chamada psql2csv
que encapsula o COPY query TO STDOUT
padrão, resultando em um CSV adequado. Sua interface é semelhante a psql
.
psql2csv [OPTIONS] < QUERY
psql2csv [OPTIONS] QUERY
A consulta é assumida como sendo o conteúdo de STDIN, se presente, ou o último argumento. Todos os outros argumentos são encaminhados para o psql, exceto estes:
-h, --help show help, then exit
--encoding=ENCODING use a different encoding than UTF8 (Excel likes LATIN1)
--no-header do not output a header
Se você tiver uma consulta mais longa e quiser usar o psql, coloque sua consulta em um arquivo e use o seguinte comando:
psql -d my_db_name -t -A -F";" -f input-file.sql -o output-file.csv
-F","
em vez de -F";"
gerar um arquivo CSV que abriria corretamente no MS Excel
Eu recomendo o DataGrip , um IDE de banco de dados da JetBrains. Você pode exportar uma consulta SQL para um arquivo CSV e configurar o encapsulamento ssh com facilidade. Quando a documentação se refere ao "conjunto de resultados", eles significam o resultado retornado por uma consulta SQL no console.
Não estou associado ao DataGrip, adoro o produto!
O JackDB , um cliente de banco de dados no seu navegador da Web, torna isso muito fácil. Especialmente se você estiver no Heroku.
Permite conectar-se a bancos de dados remotos e executar consultas SQL neles.
Fonte
(fonte: jackdb.com )
Depois que seu banco de dados estiver conectado, você poderá executar uma consulta e exportar para CSV ou TXT (veja o canto inferior direito).
Nota: Eu não sou de forma alguma afiliado ao JackDB. Atualmente, uso seus serviços gratuitos e acho que é um ótimo produto.
Por solicitação do @ skeller88, estou reposicionando meu comentário como resposta, para que não se perca por pessoas que não leem todas as respostas ...
O problema com o DataGrip é que ele controla sua carteira. Não é grátis. Experimente a edição da comunidade do DBeaver em dbeaver.io. É uma ferramenta de banco de dados multi-plataforma FOSS para programadores, DBAs e analistas de SQL que suporta todos os bancos de dados populares: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto, etc.
O DBeaver Community Edition facilita a conexão com um banco de dados, emite consultas para recuperar dados e, em seguida, faça o download do conjunto de resultados para salvá-lo em CSV, JSON, SQL ou outros formatos de dados comuns. É um concorrente viável do FOSS para o TOAD para Postgres, o TOAD para SQL Server ou o Toad para Oracle.
Não tenho afiliação com o DBeaver. Adoro o preço e a funcionalidade, mas desejo que eles abram mais o aplicativo DBeaver / Eclipse e facilitem a adição de widgets de análise ao DBeaver / Eclipse, em vez de exigir que os usuários paguem pela assinatura anual para criar gráficos e tabelas diretamente dentro a aplicação. Minhas habilidades de codificação em Java estão enferrujadas e não estou precisando de semanas para reaprender a criar widgets do Eclipse, apenas para descobrir que o DBeaver desativou a capacidade de adicionar widgets de terceiros ao DBeaver Community Edition.
Os usuários do DBeaver têm informações sobre as etapas para criar widgets de análise para adicionar ao Community Edition do DBeaver?
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'