Execute um arquivo .sql do PostgreSQL usando argumentos de linha de comando

540

Eu tenho alguns arquivos .sql com milhares de instruções INSERT e preciso executar essas inserções no meu banco de dados PostgreSQL para adicioná-las a uma tabela. Os arquivos são tão grandes que é impossível abri-los e copiar as instruções INSERT em uma janela do editor e executá-las lá. Eu descobri na Internet que você pode usar o seguinte navegando para a pasta bin da sua instalação do PostgreSQL:

psql -d myDataBase -a -f myInsertFile

No meu caso:

psql -d HIGHWAYS -a -f CLUSTER_1000M.sql

Sou solicitada uma senha para o meu usuário, mas não consigo inserir nada e, quando clico em enter, recebo este erro:

psql: FATAL: falha na autenticação da senha para o usuário "myUsername"

Por que não me permite digitar uma senha? Existe uma maneira de contornar isso, pois é fundamental que eu possa executar esses scripts?

Eu resolvi esse problema adicionando uma nova entrada no meu arquivo pg_hba.conf com a seguinte estrutura:

# IPv6 local connections:
host    myDbName    myUserName ::1/128    trust

O arquivo pg_hba.conf geralmente pode ser encontrado na pasta 'data' da sua instalação do PostgreSQL.

CSharpened
fonte
6
Você já teve sua resposta, mas apenas no caso ... "Não consigo inserir nada", você pode estar falando sobre o fato de que digitar sua senha não mostra nada? Isso é normal neste caso, normalmente digitando a senha e pressionar Enter deve trabalhar ...
Évelyne Lachance
Eu tive um problema semelhante ao instalar uma cópia do ITIS ( itis.gov ). O banco de dados não existia, então não pude usar seu nome. Por causa da maneira como o PostgreSQL funciona, eu poderia fazer isso: psql --port = 5554 --username = root --file = ITIS.sql template1 #
Cyberknight

Respostas:

157

Você tem quatro opções para fornecer uma senha:

  1. Defina a variável de ambiente PGPASSWORD. Para detalhes, consulte o manual:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. Use um arquivo .pgpass para armazenar a senha. Para detalhes, consulte o manual:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. Use "autenticação de confiança" para esse usuário específico: http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. Desde o PostgreSQL 9.1, você também pode usar uma cadeia de conexão :
    https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
um cavalo sem nome
fonte
Oi. Agora defino as configurações como confiáveis, mas noto que o software está tentando usar o nome de usuário do Windows para fazer login. Eu quero usar uma função que eu configurei no meu banco de dados Postgresql. Existe uma maneira de dizer qual função usar para executar o comando?
CSharpened
2
@CSharpened: usar o -uparâmetro conforme documentado no manual
a_horse_with_no_name
# 2 é extremamente simples. Basta adicionar uma linha contendo host: port: db: user: passar para um arquivo e pronto. Bom trabalho.
Kriil
494

Obviamente, você receberá um erro fatal ao se autenticar, porque você não inclui um nome de usuário ...

Experimente este, está tudo bem para mim :)

psql -U username -d myDataBase -a -f myInsertFile

Se o banco de dados for remoto, use o mesmo comando com o host

psql -h host -U username -d myDataBase -a -f myInsertFile
pmverma
fonte
4
Observe que o nome de usuário fornecido deve ser uma função válida do postgres. O padrão é o usuário conectado no momento.
Matthias Krull
8
Por que o -aparam?
AlikElzin-kilaka
5
@ AlikElzin-kilaka -anão é necessário aqui. É "Imprima todas as linhas de entrada não vazias na saída padrão à medida que são lidas"
mjspier
Esta deve ser a resposta aceita.
Kostanos 10/01
316

Você deve fazer assim:

\i path_to_sql_file

Vejo:

Digite a descrição da imagem aqui

Rachid O
fonte
2
Eu receboPermission denied
Zac
4
depois de fazer o chmod 777 myfileerro Permission deniedfoi corrigido
Ulug'bek Ro'zimboyev 10/04
5
@ Zac, se a sua permissão negada aconteceu em uma máquina Windows, você pode estar usando as barras incorretas.
pgsandstrom
2
Eu tive esse erro no Windows e acabou sendo as barras, como o @pgsandstrom mencionou. Barras incorretas = use barras à frente e sem aspas no caminho. \ ic: /dev/script.sql
Dave
51

Use isso para executar arquivos * .sql quando o servidor PostgreSQL estiver localizado em um local diferente:

psql -h localhost -d userstoreis -U admin -p 5432 -a -q -f /home/jobs/Desktop/resources/postgresql.sql

-h PostgreSQL server IP address
-d database name
-U user name
-p port which PostgreSQL server is listening on
-f path to SQL script
-a all echo
-q quiet

Em seguida, você será solicitado a inserir a senha do usuário.

EDIT: atualizado com base no comentário fornecido por @zwacky

GPrathap
fonte
5
@ ChickenWing24 -a: all echo, -q: calmo, -f: arquivo
zwacky
Este resolveu meu próprio problema, ótimo
Temi 'Topsy' Bello
45
export PGPASSWORD=<password>
psql -h <host> -d <database> -U <user_name> -p <port> -a -w -f <file>.sql
vishu9219
fonte
1
como posso fazer isso sem saída
Lu32 8/16
2
psql -h <host> -d <database> -U <user_name> -p <port> -a -q -w -f <arquivo> .sql
vishu9219
3
@ Lu32 Também pode deixar de fora o sinalizador -a (que significa "Imprimir todas as linhas de entrada não vazias na saída padrão à medida que são lidas"). EDIT testado, sem -a imprime menos, mas ainda apresenta muita informação. Portanto, o sinalizador -q está correto, como disse vishu9219.
Rauni Lillemets
41

Se você está logado no psql no shell do Linux, o comando é:

\i fileName.sql

por um caminho absoluto e

\ir filename.sql

para o caminho relativo de onde você chamou psql.

Florian
fonte
Como o @Florian diz, uma vez logado, você pode executar um arquivo. Lembre-se de marcar qualquer linha de comentário em seu SQL como uma das duas maneiras ... - comentar até o final da linha a) - comentar em uma linha OU b) / * comentários em várias linhas * /
Sumit S
26

Através do terminal, faça logon no seu banco de dados e tente o seguinte:

database-# >@pathof_mysqlfile.sql

ou

database-#>-i pathof_mysqlfile.sql

ou

database-#>-c pathof_mysqlfile.sql
Satish Sharma
fonte
esta solução é mais sólida quanto a mim; não aquele marcado como answe
AlexG
17

Você pode fornecer o nome de usuário e o PASSSWORD na própria linha de comandos.

   psql "dbname='urDbName' user='yourUserName' password='yourPasswd' host='yourHost'" -f yourFileName.sql
Deepu Sahni
fonte
Isso funciona se você não deseja definir variáveis ​​de ambiente ou usar arquivos de senha estranhos. =)
martin
esta deveria ter sido a resposta aceita, obrigado
grepit
13

você pode até fazê-lo desta maneira:

sudo -u postgres psql -d myDataBase -a -f myInsertFile

Se você tem sudoacesso à máquina e não é recomendado para scripts de produção apenas para teste em sua própria máquina, é a maneira mais fácil.

MDK
fonte
9

Veja como executar um SQL na linha de comando do PostgreSQL no Linux:

Abra um terminal e verifique se você pode executar o psqlcomando:

psql --version
which psql

O meu é a versão 9.1.6, localizada em /bin/psql .

Crie um arquivo de texto simples chamado mysqlfile.sql

Edite esse arquivo, coloque uma única linha:

select * from mytable;

Execute este comando na linha de comando (substituindo pgadmin e kurz_prod) por seu nome de usuário e nome do seu banco de dados:

psql -U pgadmin -d kurz_prod -a -f mysqlfile.sql

A seguir, o resultado que recebo no terminal (não é solicitada uma senha):

select * from mytable;

test1
--------
hi
me too

(2 rows)
Eric Leschinski
fonte
Como você configura um usuário? É minha primeira vez instalando e executando -f em um novo arquivo .sql. Sempre diz senha errada
mKane
4

Você pode abrir um prompt de comando e executar como administrador. Então digite

../bin>psql -f c:/...-h localhost -p 5432 -d databasename -U "postgres"

Password for user postgres: vai aparecer.

Digite sua senha e digite. Não consegui ver a senha do que estava digitando, mas desta vez, quando pressiono enter, funcionou. Na verdade, eu estava carregando dados no banco de dados.

Um iniciante
fonte
Eu acho que você quer dizer-d "postgres"
amphetamachine
@amphetamachine -d para o nome do banco de dados, verificarpsql --help
Yaz
1

Eu consegui que escrevi (localizado no diretório em que meu script está)

::someguy@host::$sudo -u user psql -d my_database -a -f file.sql 

onde -u user é a função que possui o banco de dados em que eu quero executar o script e, em seguida, ele se psqlconecta ao psqlconsole, depois que -d my_databaseme carrega mydatabasefinalmente -a -f file.sqlonde -aecoam todas as entradas do script e -fexecutam comandos de file.sqldentro e mydatabase, em seguida, saem.

Estou usando: psql (PostgreSQL) 10.12 no (Ubuntu 10.12-0ubuntu0.18.04.1)

Chars
fonte