Führen Sie eine PostgreSQL-SQL-Datei mit Befehlszeilenargumenten aus

540

Ich habe einige .sql-Dateien mit Tausenden von INSERT-Anweisungen und muss diese Einfügungen in meiner PostgreSQL-Datenbank ausführen, um sie einer Tabelle hinzuzufügen. Die Dateien sind so groß, dass es unmöglich ist, sie zu öffnen und die INSERT-Anweisungen in ein Editorfenster zu kopieren und dort auszuführen. Ich habe im Internet festgestellt, dass Sie Folgendes verwenden können, indem Sie zum Ordner bin Ihrer PostgreSQL-Installation navigieren:

psql -d myDataBase -a -f myInsertFile

In meinem Fall:

psql -d HIGHWAYS -a -f CLUSTER_1000M.sql

Ich werde dann nach einem Passwort für meinen Benutzer gefragt, kann aber nichts eingeben. Wenn ich die Eingabetaste drücke, wird folgende Fehlermeldung angezeigt:

psql: FATAL: Kennwortauthentifizierung für Benutzer "myUsername" fehlgeschlagen

Warum kann ich dann kein Passwort eingeben? Gibt es einen Ausweg, da es wichtig ist, dass ich diese Skripte ausführen kann?

Ich habe dieses Problem umgangen, indem ich einen neuen Eintrag in meine Datei pg_hba.conf mit der folgenden Struktur eingefügt habe:

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

Die Datei pg_hba.conf befindet sich normalerweise im Ordner 'data' Ihrer PostgreSQL-Installation.

CS geschärft
quelle
6
Sie haben Ihre Antwort bereits erhalten, aber nur für den Fall ... "Ich kann nichts eingeben", könnten Sie über die Tatsache sprechen, dass die Eingabe Ihres Passworts nichts anzeigt? Das ist in diesem Fall normal, normalerweise sollte es funktionieren , das Passwort einzugeben und die Eingabetaste zu drücken ...
Évelyne Lachance
Ich hatte ein ähnliches Problem bei der Installation einer Kopie von ITIS ( itis.gov ). Die Datenbank existierte nicht, daher konnte ich ihren Namen nicht verwenden. Aufgrund der Funktionsweise von PostgreSQL könnte ich Folgendes tun: psql --port = 5554 --username = root --file = ITIS.sql template1
Cyberknight

Antworten:

157

Sie haben vier Möglichkeiten, ein Passwort einzugeben:

  1. Legen Sie die Umgebungsvariable PGPASSWORD fest. Einzelheiten finden Sie im Handbuch:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. Verwenden Sie eine .pgpass-Datei, um das Passwort zu speichern. Einzelheiten finden Sie im Handbuch:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. Verwenden Sie "Vertrauensauthentifizierung" für diesen bestimmten Benutzer: http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. Seit PostgreSQL 9.1 können Sie auch eine Verbindungszeichenfolge verwenden :
    https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
ein Pferd ohne Name
quelle
Hallo. Ich habe jetzt die Einstellungen als vertrauenswürdig festgelegt, stelle jedoch fest, dass die Software versucht, meinen Windows-Benutzernamen zum Anmelden zu verwenden. Ich möchte eine Rolle verwenden, die ich in meiner Postgresql-Datenbank eingerichtet habe. Gibt es eine Möglichkeit, anzugeben, welche Rolle zum Ausführen des Befehls verwendet werden soll?
CSharpened
2
@CSharpened: Verwenden Sie den -uParameter wie im Handbuch dokumentiert
a_horse_with_no_name
# 2 ist extrem einfach. Fügen Sie einfach eine Zeile mit host: port: db: user: pass an eine Datei hinzu und fertig. Gute Arbeit.
Kriil
494

Natürlich wird bei der Authentifizierung ein schwerwiegender Fehler angezeigt, da Sie keinen Benutzernamen angeben ...

Versuchen Sie dieses, es ist OK für mich :)

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

Wenn die Datenbank remote ist, verwenden Sie denselben Befehl mit dem Host

psql -h host -U username -d myDataBase -a -f myInsertFile
pmverma
quelle
4
Beachten Sie, dass der angegebene Benutzername eine gültige Postgres-Rolle sein muss. Der Standardwert ist der aktuell angemeldete Benutzer.
Matias Krull
8
Warum der -aParameter?
AlikElzin-Kilaka
5
@ AlikElzin-kilaka -awird hier nicht benötigt. Es ist "Alle nicht leeren Eingabezeilen auf Standardausgabe
drucken,
Dies sollte die akzeptierte Antwort sein.
Kostanos
316

Sie sollten es so machen:

\i path_to_sql_file

Sehen:

Geben Sie hier die Bildbeschreibung ein

Rachid O.
quelle
2
Ich bekommePermission denied
Zac
4
nachdem chmod 777 myfileFehler Permission deniedbehoben wurden
Ulug'bek Ro'zimboyev
5
@Zac Wenn Ihre verweigerte Berechtigung auf einem Windows-Computer aufgetreten ist, verwenden Sie möglicherweise die falschen Schrägstriche.
Pgsandstrom
2
Ich hatte diesen Fehler unter Windows und es stellte sich heraus, dass es sich um Schrägstriche handelte, wie @pgsandstrom erwähnte. Falsche Schrägstriche = Verwenden Sie stattdessen Schrägstriche und kein Anführungszeichen auf dem Pfad. \ ic: /dev/script.sql
Dave
50

Verwenden Sie diese Option, um * .sql-Dateien auszuführen, wenn sich der PostgreSQL-Server an einer anderen Stelle befindet:

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

Anschließend werden Sie aufgefordert, das Kennwort des Benutzers einzugeben.

BEARBEITEN: aktualisiert basierend auf dem Kommentar von @zwacky

GPrathap
quelle
5
@ ChickenWing24 -a: alle Echo , -q: leise , -f: Datei
zwacky
Dieser hat mein eigenes Problem gelöst, großartig
Temi 'Topsy' Bello
45
export PGPASSWORD=<password>
psql -h <host> -d <database> -U <user_name> -p <port> -a -w -f <file>.sql
vishu9219
quelle
1
Wie kann ich das ohne Ausgabe tun
Lu32
2
psql -h <Host> -d <Datenbank> -U <Benutzername> -p <Port> -a -q -w -f <Datei> .sql
vishu9219
3
@ Lu32 Sie können auch das Flag -a weglassen (was bedeutet, dass "alle nicht leeren Eingabezeilen beim Lesen in die Standardausgabe gedruckt werden"). EDIT getestet, ohne -a druckt es weniger, aber immer noch zu viele Informationen. Das Flag -q ist also korrekt, wie vishu9219 sagte.
Rauni Lillemets
41

Wenn Sie in der Linux-Shell bei psql angemeldet sind, lautet der Befehl:

\i fileName.sql

für einen absoluten Weg und

\ir filename.sql

für den relativen Pfad, von dem aus Sie psql aufgerufen haben.

Florian
quelle
Wie @Florian sagt, können Sie nach dem Anmelden eine Datei ausführen. Denken Sie daran, alle Kommentarzeilen in Ihrem SQL auf zwei Arten zu markieren ...-- Kommentar zum Zeilenende a) - einzeiliger Kommentar ODER b) / * mehrzeilige Kommentare * /
Summe S
26

Melden Sie sich über das Terminal bei Ihrer Datenbank an und versuchen Sie Folgendes:

database-# >@pathof_mysqlfile.sql

oder

database-#>-i pathof_mysqlfile.sql

oder

database-#>-c pathof_mysqlfile.sql
Satish Sharma
quelle
Diese Lösung ist für mich solider. nicht derjenige, der als answe markiert ist
AlexG
17

Sie können sowohl den Benutzernamen als auch PASSSWORD in der Befehlszeile selbst angeben.

   psql "dbname='urDbName' user='yourUserName' password='yourPasswd' host='yourHost'" -f yourFileName.sql
Deepu Sahni
quelle
Dies funktioniert, wenn Sie keine Umgebungsvariablen festlegen oder seltsame Passdateien verwenden möchten. =)
Martin
Dies hätte die akzeptierte Antwort sein sollen, danke
grepit
13

Sie könnten es sogar so machen:

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

Wenn Sie sudoZugriff auf den Computer haben und dies nicht für Produktionsskripte empfohlen wird, sondern nur zum Testen auf Ihrem eigenen Computer, ist dies der einfachste Weg.

MDK
quelle
9

Führen Sie durch, wie Sie SQL in der Befehlszeile für PostgreSQL unter Linux ausführen:

Öffnen Sie ein Terminal und stellen Sie sicher, dass Sie den folgenden psqlBefehl ausführen können :

psql --version
which psql

Meins ist Version 9.1.6 in /bin/psql.

Erstellen Sie eine einfache Textdatei mit dem Namen mysqlfile.sql

Bearbeiten Sie diese Datei und fügen Sie dort eine einzelne Zeile ein:

select * from mytable;

Führen Sie diesen Befehl in der Befehlszeile aus (ersetzen Sie pgadmin und kurz_prod durch Ihren Benutzernamen und den Namen Ihrer Datenbank):

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

Das folgende Ergebnis wird auf dem Terminal angezeigt (ich werde nicht zur Eingabe eines Kennworts aufgefordert):

select * from mytable;

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

(2 rows)
Eric Leschinski
quelle
Wie richten Sie einen Benutzer ein? Es ist mein erstes Mal, dass ich -f auf einer neuen .sql-Datei installiere und ausführe. Sagt immer falsches Passwort
mKane
4

Sie können eine Eingabeaufforderung öffnen und als Administrator ausführen. Geben Sie dann ein

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

Password for user postgres: wird auftauchen.

Geben Sie Ihr Passwort ein und geben Sie ein. Ich konnte das eingegebene Passwort nicht sehen, aber diesmal funktionierte es, wenn ich die Eingabetaste drückte. Eigentlich habe ich Daten in die Datenbank geladen.

ein Anfänger
quelle
Ich denke du meinst-d "postgres"
Amphetamachine
@amphetamachine -d für Datenbanknamen, überprüfen Siepsql --help
Yaz
1

Ich habe das geschrieben (befindet sich in dem Verzeichnis, in dem sich mein Skript befindet)

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

Wo -u user ist die Rolle, der die Datenbank gehört, in der ich das Skript ausführen möchte? Dann wird die psqlVerbindung zur psqlKonsole hergestellt. Danach wird -d my_databaseich mydatabasegeladen, -a -f file.sqlwo -aalle Eingaben aus dem Skript wiedergegeben und -fBefehle von file.sqlin ausgeführt werdenmydatabase und dann beendet werden.

Ich benutze: psql (PostgreSQL) 10.12 on (Ubuntu 10.12-0ubuntu0.18.04.1)

Zeichen
quelle