Exécutez un fichier PostgreSQL .sql à l'aide d'arguments de ligne de commande

540

J'ai des fichiers .sql contenant des milliers d'instructions INSERT et j'ai besoin d'exécuter ces insertions sur ma base de données PostgreSQL afin de les ajouter à une table. Les fichiers sont si volumineux qu'il est impossible de les ouvrir et de copier les instructions INSERT dans une fenêtre d'éditeur et de les y exécuter. J'ai trouvé sur Internet que vous pouvez utiliser les éléments suivants en accédant au dossier bin de votre installation PostgreSQL:

psql -d myDataBase -a -f myInsertFile

Dans mon cas:

psql -d HIGHWAYS -a -f CLUSTER_1000M.sql

On me demande ensuite un mot de passe pour mon utilisateur, mais je ne peux rien entrer et quand je tape sur Entrée, j'obtiens cette erreur:

psql: FATAL: l'authentification par mot de passe a échoué pour l'utilisateur "myUsername"

Pourquoi ne me laisse-t-il pas entrer un mot de passe? Y a-t-il un moyen de contourner cela car il est essentiel que je puisse exécuter ces scripts?

J'ai contourné ce problème en ajoutant une nouvelle entrée dans mon fichier pg_hba.conf avec la structure suivante:

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

Le fichier pg_hba.conf se trouve généralement dans le dossier 'data' de votre installation PostgreSQL.

CSharpened
la source
6
Vous avez déjà eu votre réponse mais juste au cas où ... "Je ne peux rien entrer", pourriez-vous parler du fait que taper votre mot de passe n'affiche rien? C'est normal dans ce cas, taper normalement le mot de passe et appuyer sur Entrée devrait fonctionner ...
Évelyne Lachance
J'ai rencontré un problème similaire lors de l'installation d'une copie de ITIS ( itis.gov ). La base de données n'existait pas, donc je ne pouvais pas utiliser son nom. En raison du fonctionnement de PostgreSQL, je pouvais faire ceci: psql --port = 5554 --username = root --file = ITIS.sql template1
Cyberknight

Réponses:

157

Vous avez quatre choix pour fournir un mot de passe:

  1. Définissez la variable d'environnement PGPASSWORD. Pour plus de détails, consultez le manuel:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. Utilisez un fichier .pgpass pour stocker le mot de passe. Pour plus de détails, consultez le manuel:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. Utilisez "l'authentification de confiance" pour cet utilisateur spécifique: http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. Depuis PostgreSQL 9.1, vous pouvez également utiliser une chaîne de connexion :
    https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
un cheval sans nom
la source
Salut. J'ai maintenant défini les paramètres pour faire confiance, mais je remarque que le logiciel essaie d'utiliser mon nom d'utilisateur Windows pour se connecter. Je souhaite utiliser un rôle que j'ai configuré dans ma base de données Postgresql. Existe-t-il un moyen de lui dire quel rôle utiliser pour exécuter la commande?
Aiguisé
2
@CSharpened: utilisez le -uparamètre comme
indiqué
# 2 est extrêmement simple. Ajoutez simplement une ligne contenant host: port: db: user: passez à un fichier et vous avez terminé. Bon travail.
Kriil
494

Bien sûr, vous obtiendrez une erreur fatale pour l'authentification, car vous n'incluez pas de nom d'utilisateur ...

Essayez celui-ci, c'est OK pour moi :)

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

Si la base de données est distante, utilisez la même commande avec l'hôte

psql -h host -U username -d myDataBase -a -f myInsertFile
pmverma
la source
4
Notez que le nom d'utilisateur fourni doit être un rôle postgres valide. La valeur par défaut est l'utilisateur actuellement connecté.
matthias krull
8
Pourquoi le -aparam?
AlikElzin-kilaka
5
@ AlikElzin-kilaka -an'est pas nécessaire ici. C'est "Imprimer toutes les lignes d'entrée non vides sur la sortie standard au fur et à mesure de leur lecture"
mjspier
Ce devrait être la réponse acceptée.
Kostanos
316

Vous devez le faire comme ceci:

\i path_to_sql_file

Voir:

Entrez la description de l'image ici

Rachid O
la source
2
Je reçoisPermission denied
Zac
4
après avoir fait l' chmod 777 myfileerreur a Permission deniedété corrigé
Ulug'bek Ro'zimboyev
5
@Zac si votre autorisation refusée s'est produite sur une machine Windows, vous utilisez peut-être des barres obliques incorrectes.
pgsandstrom
2
J'ai eu cette erreur sur Windows et il s'est avéré que ce sont les barres obliques, comme l'a mentionné @pgsandstrom. Mauvaises barres obliques = utilisez plutôt des barres obliques et aucune citation sur le chemin. \ ic: /dev/script.sql
Dave
51

Utilisez-le pour exécuter des fichiers * .sql lorsque le serveur PostgreSQL se trouve à un endroit différent:

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

Vous êtes ensuite invité à saisir le mot de passe de l'utilisateur.

EDIT: mis à jour sur la base du commentaire fourni par @zwacky

GPrathap
la source
5
@ ChickenWing24 -a: tous les échos ,: -qsilencieux -f
,:
Celui-ci a résolu mon propre problème, super
Temi 'Topsy' Bello
45
export PGPASSWORD=<password>
psql -h <host> -d <database> -U <user_name> -p <port> -a -w -f <file>.sql
vishu9219
la source
1
comment puis-je faire cela sans sortie
Lu32
2
psql -h <hôte> -d <base de données> -U <nom_utilisateur> -p <port> -a -q -w -f <fichier> .sql
vishu9219
3
@ Lu32 Vous pouvez également laisser l'indicateur -a (ce qui signifie "Imprimer toutes les lignes d'entrée non vides sur la sortie standard lors de leur lecture"). Testé par EDIT, sans -a, il imprime moins, mais toujours trop d'informations. Le drapeau -q est donc correct, comme l'a dit vishu9219.
Rauni Lillemets
41

Si vous êtes connecté à psql sur le shell Linux, la commande est:

\i fileName.sql

pour un chemin absolu et

\ir filename.sql

pour le chemin relatif d'où vous avez appelé psql.

Florian
la source
Comme le dit @Florian, une fois connecté, vous pouvez exécuter un fichier. N'oubliez pas de marquer toutes les lignes de commentaire dans votre SQL de l'une des deux manières ... - commentaire à la fin de la ligne a) - commentaire d'une ligne OU b) / * commentaires de plusieurs lignes * /
Sumit S
26

Via le terminal, connectez-vous à votre base de données et essayez ceci:

database-# >@pathof_mysqlfile.sql

ou

database-#>-i pathof_mysqlfile.sql

ou

database-#>-c pathof_mysqlfile.sql
Satish Sharma
la source
cette solution est plus solide quant à moi; pas celui marqué comme answe
AlexG
17

Vous pouvez donner à la fois le nom d'utilisateur et le MOT DE PASSE sur la ligne de commande elle-même.

   psql "dbname='urDbName' user='yourUserName' password='yourPasswd' host='yourHost'" -f yourFileName.sql
Deepu Sahni
la source
Cela fonctionne si vous ne souhaitez pas définir de variables d'environnement ou utiliser des fichiers de passe étranges. =)
martin
cela aurait dû être la réponse acceptée, merci
grepit
13

vous pouvez même le faire de cette façon:

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

Si vous avez sudoaccès à la machine et qu'il n'est pas recommandé pour les scripts de production juste pour le test sur votre propre machine, c'est la manière la plus simple.

MDK
la source
9

Découvrez comment exécuter un SQL sur la ligne de commande pour PostgreSQL sous Linux:

Ouvrez un terminal et assurez-vous que vous pouvez exécuter la psqlcommande:

psql --version
which psql

Le mien est la version 9.1.6 située dans /bin/psql.

Créez un fichier texte simple appelé mysqlfile.sql

Modifiez ce fichier, mettez une seule ligne dedans:

select * from mytable;

Exécutez cette commande sur la ligne de commande (en substituant votre nom d'utilisateur et le nom de votre base de données à pgadmin et kurz_prod):

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

Voici le résultat que j'obtiens sur le terminal (je ne suis pas invité à entrer un mot de passe):

select * from mytable;

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

(2 rows)
Eric Leschinski
la source
Comment configurez-vous un utilisateur? C'est la première fois que j'installe et exécute -f sur un nouveau fichier .sql. Dit toujours un mauvais mot de passe
Dit
4

Vous pouvez ouvrir une invite de commande et exécuter en tant qu'administrateur. Tapez ensuite

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

Password for user postgres: apparaîtra.

Tapez votre mot de passe et entrez. Je ne pouvais pas voir le mot de passe que je tapais, mais cette fois, lorsque j'appuie sur Entrée, cela a fonctionné. En fait, je chargeais des données dans la base de données.

un débutant
la source
Je pense que vous voulez dire-d "postgres"
amphétamachine
@amphetamachine -d pour le nom de la base de données, vérifiezpsql --help
Yaz
1

J'ai réussi à écrire (situé dans le répertoire où se trouve mon script)

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

-u user est le rôle qui possède la base de données où je veux exécuter le script, puis le se psqlconnecte à la psqlconsole après cela -d my_databaseme charge mydatabaseenfin -a -f file.sql-afont écho toutes les entrées du script et -fexécutent les commandes de file.sqldans mydatabase, puis quittent.

J'utilise: psql (PostgreSQL) 10.12 sur (Ubuntu 10.12-0ubuntu0.18.04.1)

Caractères
la source