AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 7651
Accepted
jkebinger
jkebinger
Asked: 2011-11-08 14:04:24 +0800 CST2011-11-08 14:04:24 +0800 CST 2011-11-08 14:04:24 +0800 CST

O comando de cópia (\copy) do cliente Postgres não tem acesso a uma tabela temporária?

  • 772

Estou gerando uma lista de comandos SQL para exportar alguns dados que executo usando psql -f. Todas as consultas obtêm o mesmo subconjunto de dados, então pensei em fatorar as qualificações e colocar uma lista de IDs de usuários qualificados em tabelas temporárias assim

create temporary table tmp_export_users as (select id from users where ...)

em seguida, consulte isso nos meus comandos \copy como

\copy (select ... from table where user_id in (select id from tmp_export_users)) TO 'filename.csv' WITH CSV HEADER

Esses estão todos no mesmo arquivo, um por linha, e executando-os -f recebo o erro de que os comandos de cópia não podem ver a tabela temporária, então estou supondo que o comando de cópia do cliente não deve realmente usar o mesmo postgres sessão como psql.

Isso é correto? Existe uma maneira de mudar esse comportamento?

postgresql psql
  • 1 1 respostas
  • 57058 Views

1 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2011-11-08T16:47:46+08:002011-11-08T16:47:46+08:00

    \copy pode usar uma tabela temporária.

    Primeiro testei e confirmei isso com a versão 9.0 na linha de comando.
    Em seguida, criei um arquivo com o comando meta SQL e psql \copyusando várias tabelas temporárias. Isso funcionou para mim também.

    CREATE TEMP TABLE tmp as SELECT * FROM tbl;
    \copy (SELECT * FROM tmp JOIN tbl USING (id)) TO '/var/lib/postgres/test1.csv';
    

    Ligar:

    psql -p5432 mydb -f test.sql
    

    Observe o ponto e vírgula final, que é opcional no final de um arquivo (terminado implicitamente), mas necessário após qualquer outra instrução SQL e também após a última, se executada no psql interativamente.

    Normalmente , meta-comandos psql não podem ser misturados com SQL na mesma linha em um arquivo executado por psql -f. Cito o manual no psql :

    A análise de argumentos para no final da linha ou quando outra barra invertida sem aspas é encontrada. Uma barra invertida sem aspas é considerada o início de um novo metacomando. A sequência especial \\(duas barras invertidas) marca o fim dos argumentos e continua analisando os comandos SQL, se houver. Dessa forma, os comandos SQL e psql podem ser misturados livremente em uma linha. Mas, de qualquer forma, os argumentos de um metacomando não podem continuar além do fim da linha.

    No entanto, regras diferentes se aplicam após \copy . Essencialmente, o psql volta para o modo SQL automaticamente após \copyVeja:

    • Como atualizar linhas selecionadas com valores de um arquivo CSV no Postgres?

    Mas você escreveu que tinha todos os comandos em linhas separadas. Então essa não pode ser a explicação no seu caso.


    Deixando tudo isso de lado, você já pensou em usar COPY(o comando SQL ) em vez de \copy(o meta-comando psql )?

    Obviamente, o arquivo de destino teria que ser local para o servidor e não para o cliente neste caso. E diferentes privilégios de arquivo se aplicam. O manual :

    Os arquivos nomeados em um COPYcomando são lidos ou gravados diretamente pelo servidor, não pelo aplicativo cliente. Portanto, eles devem residir ou ser acessíveis à máquina do servidor de banco de dados, não ao cliente. Eles devem ser acessíveis e legíveis ou graváveis ​​pelo usuário do PostgreSQL (o ID do usuário com o qual o servidor é executado), não pelo cliente.

    • 19

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve