#1 Fri 22 February 2019 08:39
- EmilieCCBE
- Participant actif
- Date d'inscription: 22 Nov 2018
- Messages: 80
[Shp2Pgsql] Passer un password dans la commande
Bonjour,
je souhaite utiliser shp2pgsql pour charger des shape ne lot dans postgis. J'ai crée un script qui génère les commandes nécessaires pour l'ensemble des shape se trouvant dans un dossier. Cependant je ne parviens pas à passer le mot de passe d'accès à ma base dans la commande. Mon code est le suivant :
Code:
shp2pgsql -D -s 3945 -I -W LATIN1 C:\Users\lechemin\vers\monshape.shp bdd_integration_temporaire.matable | psql -d bac_sable -U postgres
Lorsque j'éxacute ce code directement dans la console, le prompt me demande mon mot de passe. Et tout s'éxecute parfaitement. Lorsque je passe cette commande via un script python avec le code suivant :
Code:
command = shp2pgsql -D -s 3945 -I -W LATIN1 C:\Users\lechemin\vers\monshape.shp bdd_integration_temporaire.matable | psql -d bac_sable -U postgres os.system(command)
le code semble s'exécuter normalement mais aucune donnée ne s'écrit, et pour cause, normalement le script ne permet pas d'accéder à la base.
J'ai essayé de m'appuyer sur ce post : https://gis.stackexchange.com/questions … ing-centos et d'ajouter la commande PGPASSWORD = monpassword mais la commande n'est pas reconnue.
Avez vous des pistes quant au paramètre à utiliser pour indiquer le mot de passe à shp2pgsql?
Merci par avance pour vos réponses.
Belle journée.
Emilie
Hors ligne
#2 Fri 22 February 2019 12:07
- Blaise Picinbono
- Participant actif
- Date d'inscription: 8 Jan 2015
- Messages: 70
- Site web
Re: [Shp2Pgsql] Passer un password dans la commande
Bonjour;
Dans votre script Python, vous mettez bien la définition de votre variable "command" entre double guillemêts, n'est-ce pas ?:
Code:
command = "shp2pgsql -D -s 3945 -I -W LATIN1 C:\Users\lechemin\vers\monshape.shp bdd_integration_temporaire.matable | psql -d bac_sable -U postgres"
Il y a plusieurs façons d'établir une connexion psql dans un script sans avoir à fournir un mot de passe. L'une d'elle est l'utilisation d'un fichier .pgpass.
Si vous utilisez un système linux, créer ce fichier .pgpass à la racine du répertoire de l'utilisateur avec lequel le script Python est lancé, par exemple /home/emilie/
Dans ce fichier /home/emilie/.pgpass, mettez une ligne avec ces paramètres:
hostname:port:database:username:password
comme indiqué dans cette doc: https://www.postgresql.org/docs/9.3/libpq-pgpass.html
Ne pas oublier de faire un chmod 600 sur ce fichier
Code:
$ chmod 600 /home/emilie/.pgpass
Ensuite, dans le script Python, je pense (mais pas certain) qu'il faut bien spécifier, l'hôte, le port, la base de données et l'utilisateur, ainsi votre commande serait:
Code:
command = "shp2pgsql -D -s 3945 -I -W LATIN1 C:\Users\lechemin\vers\monshape.shp bdd_integration_temporaire.matable | psql -h nomdelhote -p 5432 -d bac_sable -U postgres""
(en supposant que le serveur postgresql est bien sur le port 5432, celui par défaut).
Cette solution doit fonctionner avec Windows également, voir la doc pour le répertoire du fichier .pgpass.
Si ça ne fonctionne toujours pas, qu'y a-t-il d'écrit dans les logs de postgresql lorsque le script tourne ?
Dernière modification par Blaise Picinbono (Fri 22 February 2019 12:09)
Hors ligne
#3 Mon 25 February 2019 10:07
- EmilieCCBE
- Participant actif
- Date d'inscription: 22 Nov 2018
- Messages: 80
Re: [Shp2Pgsql] Passer un password dans la commande
Bonjour,
merci pour les conseils.
Je suis sous windows. D'après la documentation postgres, sous windows, le fichier a créée est pgpass.conf que j'ai stocké dans le dossier User/appdata/postgres. J'ai créée une variable d'environnement PGPASSFILE avec le chemin complet du fichier dans mes variables d'environnement.
Ensuite pour test, j'ai relancé la commande suivante dans mon cmd :
Code:
shp2pgsql -D -s 3945 -I -W LATIN1 C:\mon\chemin\vers\monshape.shp bdd_integration_temporaire.matable | psql -h monhote -d mabasededonnee -U admin_bdd
Le prompt ne me demande plus de mot de passe par contre il me renvoie que l'authentification a échouée. J'en déduis qu'il doit détecter qu'il y a un fichier de type pgpass mais qu'il ne parvient pas pour autant à effectuer la connexion. J'ai vérifier les paramètres indiqués dans mon fichier. A priori, tout est bon. J'ai construit le fichier pgpass.conf comme suit :
Code:
mon.hote:5432:ma_base:admin_bdd:mon_password
Cela pourrait il venir des droits d'accès définit côté serveur dans le fichier pg_hba.conf ?
Merci par avance pour vos réponses.
Belle journée.
Emilie.
Hors ligne
#4 Mon 25 February 2019 14:00
- Blaise Picinbono
- Participant actif
- Date d'inscription: 8 Jan 2015
- Messages: 70
- Site web
Re: [Shp2Pgsql] Passer un password dans la commande
Bonjour;
Vous devez spécifier le port de postgresql dans votre commande:
Code:
shp2pgsql -D -s 3945 -I -W LATIN1 C:\mon\chemin\vers\monshape.shp bdd_integration_temporaire.matable | psql -h monhote -p 5432 -d mabasededonnee -U admin_bdd
(en suposant que votre serveur postgresql est bien sur le port 5432)
Dans le fichier de configuration pg_hba.conf, la méthode d'authentification doit être "md5".
Hors ligne
#5 Mon 25 February 2019 14:26
- EmilieCCBE
- Participant actif
- Date d'inscription: 22 Nov 2018
- Messages: 80
Re: [Shp2Pgsql] Passer un password dans la commande
Merci.
Lorsque j'indique le port, la commande fonctionne sans avoir besoin d'indiquer le mot de passe dans le prompt. Ce qui est déjà un très très bon point.
Cependant, la commande ne fonctionne pas lorsque je l'envoie via mon script Python (après avoir mis la commande entre double quote). Le script se déroule bien . Le process semble se terminé sans problème. Mais la table voulue n'est pas crée en base de données. Je vais donc aller consulter les log postgres pour essayer de détecter la source du problème.
Bonne après midi.
Emilie.
Hors ligne