Esegui un file PostgreSQL .sql usando gli argomenti della riga di comando


540

Ho alcuni file .sql con migliaia di istruzioni INSERT al loro interno e ho bisogno di eseguire questi inserti sul mio database PostgreSQL per aggiungerli a una tabella. I file sono così grandi che è impossibile aprirli e copiare le istruzioni INSERT in una finestra dell'editor ed eseguirle lì. Ho scoperto su Internet che è possibile utilizzare quanto segue navigando nella cartella bin dell'installazione PostgreSQL:

psql -d myDataBase -a -f myInsertFile

Nel mio caso:

psql -d HIGHWAYS -a -f CLUSTER_1000M.sql

Mi viene quindi richiesta una password per il mio utente, ma non riesco a inserire nulla e quando premo Invio ottengo questo errore:

psql: FATAL: autenticazione password non riuscita per l'utente "myUsername"

Perché non mi permette di inserire una password. C'è un modo per aggirare questo dato che è fondamentale poter eseguire questi script?

Ho risolto questo problema aggiungendo una nuova voce nel mio file pg_hba.conf con la seguente struttura:

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

Il file pg_hba.conf si trova di solito nella cartella "data" dell'installazione di PostgreSQL.


6
Hai già avuto la tua risposta, ma nel caso ... "Non riesco a inserire nulla", potresti parlare del fatto che digitando la password non viene visualizzato nulla? È normale in questo caso, normalmente digitare la password e premere Invio dovrebbe funzionare ...
Évelyne Lachance

Ho avuto un problema simile durante l'installazione di una copia di ITIS ( itis.gov ). Il database non esisteva, quindi non ho potuto usare il suo nome. Grazie al modo in cui funziona PostgreSQL, potrei farlo: psql --port = 5554 --username = root --file = ITIS.sql template1
Cyberknight

Risposte:


157

Hai quattro opzioni per fornire una password:

  1. Impostare la variabile d'ambiente PGPASSWORD. Per i dettagli consultare il manuale:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. Utilizzare un file .pgpass per memorizzare la password. Per i dettagli consultare il manuale:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. Usa "autenticazione sicura" per quell'utente specifico: http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. Da PostgreSQL 9.1 puoi anche usare una stringa di connessione :
    https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING

Ciao. Ora ho configurato le impostazioni in modo affidabile ma noto che il software sta tentando di utilizzare il mio nome utente di Windows per effettuare l'accesso. Voglio usare un ruolo che ho impostato nel mio database Postgresql. C'è un modo per dirgli quale ruolo utilizzare per eseguire il comando?
CSharpened

2
@Charpened: usa il -uparametro come documentato nel manuale
a_horse_with_no_name

# 2 è estremamente semplice. Basta aggiungere una riga contenente host: port: db: user: passare a un file e il gioco è fatto. Bel lavoro.
Kriil,

494

Naturalmente, otterrai un errore irreversibile per l'autenticazione, perché non includi un nome utente ...

Prova questo, va bene per me :)

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

Se il database è remoto, utilizzare lo stesso comando con host

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

4
Nota che il nome utente fornito deve essere un ruolo postgres valido. L'impostazione predefinita è l'utente attualmente connesso.
Matthias Krull,

8
Perché il -aparam?
AlikElzin-Kilaka,

5
@ AlikElzin-kilaka -anon è necessario qui. È "Stampa tutte le righe di input non
vuote

Questa dovrebbe essere la risposta accettata.
Kostanos,

316

Dovresti farlo in questo modo:

\i path_to_sql_file

Vedere:

Inserisci qui la descrizione dell'immagine


2
RicevoPermission denied
Zac il

4
dopo aver fatto l' chmod 777 myfileerrore è Permission deniedstato corretto
Ulug'bek Ro'zimboyev il

5
@Zac se la tua autorizzazione negata è avvenuta su un computer Windows, potresti usare le barre sbagliate.
pgsandstrom,

2
Ho avuto questo errore su Windows e si è rivelato essere le barre, come menzionato @pgsandstrom. Barre errate = utilizzare invece barre dirette e nessuna citazione sul percorso. \ ic: /dev/script.sql
Dave,

51

Usalo per eseguire i file * .sql quando il server PostgreSQL si trova in una posizione diversa:

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

Quindi viene richiesto di inserire la password dell'utente.

EDIT: aggiornato in base al commento fornito da @zwacky


5
@ ChickenWing24 -a: tutto eco ,: -qtranquillo -f
,:

Questo ha risolto il mio problema, fantastico
Temi 'Topsy' Bello

45
export PGPASSWORD=<password>
psql -h <host> -d <database> -U <user_name> -p <port> -a -w -f <file>.sql

1
come posso farlo senza uscita
Lu32

2
psql -h <host> -d <database> -U <nome_utente> -p <porta> -a -q -w -f <file> .sql
vishu9219

3
@ Lu32 Potresti anche tralasciare il flag -a (che significa "Stampa tutte le righe di input non vuote sullo standard output mentre vengono lette"). EDIT testato, senza -a stampa meno, ma comunque troppe informazioni. Quindi il flag -q è corretto, come diceva vishu9219.
Rauni Lillemets,

41

Se si è effettuato l'accesso a psql sulla shell Linux il comando è:

\i fileName.sql

per un percorso assoluto e

\ir filename.sql

per il percorso relativo da dove hai chiamato psql.


Come dice @Florian, una volta effettuato l'accesso è possibile eseguire un file. Ricordatevi di marcare tutte le righe di commento nel vostro SQL come uno dei due modi ...-- commento alla fine della riga a) - una riga di commento o B) / * su più righe commenti * /
Sumit S

26

Tramite il terminale accedere al database e provare questo:

database-# >@pathof_mysqlfile.sql

o

database-#>-i pathof_mysqlfile.sql

o

database-#>-c pathof_mysqlfile.sql

questa soluzione è più solida come per me; non quello contrassegnato come answe
AlexG

17

È possibile fornire sia il nome utente che PASSSWORD dalla riga di comando stessa.

   psql "dbname='urDbName' user='yourUserName' password='yourPasswd' host='yourHost'" -f yourFileName.sql

Funziona se non si desidera impostare variabili di ambiente o utilizzare strani file di passaggio. =)
martin

questa avrebbe dovuto essere la risposta accettata, grazie
grepit

13

potresti persino farlo in questo modo:

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

Se hai sudoaccesso al computer e non è consigliato per gli script di produzione solo per il test sul tuo computer, è il modo più semplice.


9

Scoprite come eseguire un SQL dalla riga di comando per PostgreSQL in Linux:

Apri un terminale e assicurati di poter eseguire il psqlcomando:

psql --version
which psql

La mia è la versione 9.1.6 che si trova in /bin/psql.

Crea un semplice file di testo chiamato mysqlfile.sql

Modifica quel file, inserisci una sola riga:

select * from mytable;

Esegui questo comando dalla riga di comando (sostituendo il nome utente e il nome del database con pgadmin e kurz_prod):

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

Il seguente è il risultato che ottengo sul terminale (non mi viene richiesta una password):

select * from mytable;

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

(2 rows)

Come si configura un utente? È la prima volta che installo ed eseguo -f su un nuovo file .sql. Dice sempre una password errata
mKane

4

È possibile aprire un prompt dei comandi ed eseguire come amministratore. Quindi digitare

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

Password for user postgres: si presenterà.

Digita la password e inserisci. Non riuscivo a vedere la password che stavo scrivendo, ma questa volta quando premo Invio ha funzionato. In realtà stavo caricando i dati nel database.


Penso che intendi-d "postgres"
anfetamachina il

@amphetamachine -d per il nome del database, controllarepsql --help
Yaz

1

Ho ottenuto che ha scritto (situato nella directory in cui si trova il mio script)

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

dove si -u user trova il ruolo che possiede il database in cui voglio eseguire lo script, quindi mi psqlconnette alla psqlconsole dopo che -d my_databasemi carica mydatabaseinfine -a -f file.sqldove -aecho tutto l'input dallo script ed -feseguo i comandi da file.sqldentro mydatabase, quindi esce.

Sto usando: psql (PostgreSQL) 10.12 su (Ubuntu 10.12-0ubuntu0.18.04.1)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.