Qual é a maneira mais fácil de salvar a saída PL / pgSQL de um banco de dados PostgreSQL em um arquivo CSV?
Estou usando o PostgreSQL 8.4 com o plugin pgAdmin III e PSQL, de onde executo consultas.
sql
postgresql
csv
postgresql-copy
Hoff
fonte
fonte
Respostas:
Deseja o arquivo resultante no servidor ou no cliente?
Lado do servidor
Se você quiser algo fácil de reutilizar ou automatizar, use o comando COPY incorporado do Postgresql . por exemplo
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.
Lado do cliente
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:Observe que não há finalização
;
, porque os meta-comandos são finalizados por nova linha, diferente dos comandos SQL.Dos documentos :
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ásicaspg_copy_from
epg_copy_to
que copiam para / de uma matriz PHP, o que pode não ser eficiente para grandes conjuntos de dados.fonte
\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 nopsql
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:
1
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ê obtenhacopy
Comando 2 postgresCOPY (SELECT * from users) To '/tmp/output.csv' With CSV;
3 psql interativo (ou não)
Todos eles podem ser usados em scripts, mas eu prefiro o número 1.
4 pgadmin, mas isso não é programável.
fonte
No terminal (enquanto conectado ao db), defina a saída para o arquivo cvs
1) Defina o separador de campo como
','
:2) Defina o formato de saída desalinhado:
3) Mostrar apenas tuplas:
4) Definir saída:
5) Execute sua consulta:
6) Saída:
Você poderá encontrar seu arquivo csv neste local:
Copie-o usando o
scp
comando ou edite-o usando o nano:fonte
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
Isso é um pouco mais simples do que
que, até onde sei, são equivalentes.
fonte
Unificação de Exportação CSV
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 é:Lembre-se de apenas um comando!
É ótimo para uso em ssh:
É ótimo para uso dentro do docker sobre ssh:
É ótimo na máquina local:
Ou dentro da janela de encaixe na máquina local ?:
Ou em um cluster kubernetes, na janela de encaixe, sobre HTTPS ??:
Tão versátil, muitas vírgulas!
Você até?
Sim, fiz, aqui estão minhas anotações:
As CÓPIAS
Usar
/copy
efetivamente executa operações de arquivo em qualquer sistema em que opsql
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 executandopsql
para / do servidor remoto.COPY
executa operações de arquivo no servidor como a conta de usuário do processo de back-end (padrãopostgres
), os caminhos e as permissões de arquivo são verificados e aplicados de acordo. Se estiver usandoTO 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 localpsql
. Da mesma forma, para grandes importações, mover o arquivo de origem para o servidor e usá-loCOPY
é provavelmente a opção de maior desempenho.Parâmetros PSQL
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:
Outras ferramentas
Não, eu só quero tirar o CSV do meu servidor sem compilar e / ou instalar uma ferramenta.
fonte
Eu tive que usar o \ COPY porque recebi a mensagem de erro:
Então eu usei:
e está funcionando
fonte
psql
pode fazer isso por você:Consulte
man psql
para obter ajuda sobre as opções usadas aqui.fonte
Nova versão - psql 12 - será suportada
--csv
.Uso:
fonte
Estou trabalhando no AWS Redshift, que não suporta o
COPY TO
recurso.Porém, minha ferramenta de BI suporta CSVs delimitados por tabulação, então usei o seguinte:
fonte
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.
fonte
Tentei várias coisas, mas poucas delas conseguiram me fornecer o CSV desejado com detalhes do cabeçalho.
Aqui está o que funcionou para mim.
fonte
Eu escrevi uma pequena ferramenta chamada
psql2csv
que encapsula oCOPY query TO STDOUT
padrão, resultando em um CSV adequado. Sua interface é semelhante apsql
.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:
fonte
Se você tiver uma consulta mais longa e quiser usar o psql, coloque sua consulta em um arquivo e use o seguinte comando:
fonte
-F","
em vez de-F";"
gerar um arquivo CSV que abriria corretamente no MS ExcelPara fazer o download do arquivo CSV com nomes de colunas como HEADER, use este comando:
fonte
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!
fonte
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.
fonte
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?
fonte
fonte