Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Merci pour l'intérêt porté et les réponses proposées !
Je suis dans une structure organisée en agences sur différentes régions.
L'idée est de proposer un outil qui puisse tourner sur n'importe quel poste, qu'il soit connecté au réseau de la structure ou non, pour réaliser un certain nombre de calculs et d'analyses géographiques. Sachant que de toutes façons il n'y a pas de serveur de base de données géographiques unique, chacun se crée son propre serveur sur son propre ordinateur au besoin... (j'espère utiliser les bons termes et me faire comprendre... )
Les utilisateurs de l'outil ne sont pas forcément adeptes de logiciels cartographiques, ou de gestionnaires de base de données, et encore moins de SQL...
C'est pourquoi je cherche à créer cet outil le plus simple possible pour les utilisateurs à venir, sans trop de manipulations et de termes ou noms de logiciels abracadabrantesques
Ils sont tous en Windows mais avec une grande disparité de version (de XP -oui oui- à 10?)
L'installation de Postgresql/PostGis + la disponibilité de psql.exe + la disponibilité de shp2pgsql.exe + le script batch + le(s) fichier(s) .sql + les fichiers csv ou shp me semble une bonne alternative.
Ainsi, je souhaitais transmettre l'outil au travers d'un dossier de fichiers [BILAN] avec une arborescence fixe contenant :
- les .exe nécessaires (Postgresql, psql, shp2pgsql, PgAdminIII pour les plus avertis - avec les bonnes versions car elles sont appelées dans le batch)
- les scripts batch et sql
- les fichiers de données permanents au format csv et/ou shp que les scripts importeront dans la base de données
- les fichiers de "données d'entrées" au format csv et/ou shp que l'utilisateur aura à remplacer et que les scripts importeront dans la base de données
- les fichiers résultats produits par les scripts
Et demander à l'utilisateur :
- d'installer Postgresql/PostGis sur leur poste (et PgAdminIII pour les plus avertis)
- de créer la base avec les paramètres indiqués dans mon script batch (ou alors je peux le faire par le script peut-être plus simple ?)
- d'enregistrer le dossier de fichiers [BILAN] au bon endroit (C:\Users\Public\Documents\) afin que les scripts puissent bien tourner
- de lancer le fichier batch
Les "données d'entrée" pour l'analyse sont :
- soit fournies par l'outil : je les ai inclus dans les dossiers de l'outil pour qu'ils soient importés (fichiers shp ou csv) à chaque lancement des analyses. J'avais aussi pensé à un dump, et je ne jette pas l'idée car je pense que j'ai finalement tout intérêt (en complément du script de création de la base ? ... je n'ai encore pas fait ce genre de code )
- soit récupérées auprès d'autres contributeurs : l'utilisateur doit les enregistrer au bon format au bon endroit et l'outil vient les récupérer pour les importer dans la base postgresql.
J'espère avoir été "limpide" dans ces explications ?...
Qu'en pensez-vous ? Est-il possible de simplifier encore ?
D'avance merci
PS : j'ai encore un gros problème de compréhension et donc de gestion des jeux de caractères, entre le serveur, le client, les fichiers bat et sql... Je suppose qu'il vaudrait mieux poser la question dans un autre post ? Encore merci !
Bonjour dverite,
Et merci pour ces indications ! C'est parfait !
- pour l'erreur 1 : j'ai relancé la requête avec un fichier sql sans BOM (Via Notepad++ > Encodage > Encoder en UTF8 (sans BOM))
- pour les erreurs types 2 et 3, j'avais oublié le caractère de fin de requête (;) sur quelques lignes...
Pour l'aspect 'logistique' ou 'configuration', qu'en pensez-vous ?
Je sais que ce n'est pas le top du tout mais bon... je voyais bien la solution d'un petit dossier qui se balade d'une personne à l'autre, avec tous les fichiers nécessaires à l'analyse souhaitée :
- QGis avec tutoriel d'installation,
- postgresql 9.5 (PgAdmin pas forcément) avec tutoriel d'installation ?,
- psql.exe (comme proposais jmarsac),
- fichier batch (lancement postgresql 9.5 sur port 5432, création/modification base de donnée, lancement des requêtes de création/modification de tables et vues = d'analyse des données),
- fichiers csv et shape,
- projet QGis,
- tutoriel pour tout ça (où enregistrer les fichiers shapes et csv sources notamment)
... mouais...hein ?
Bonjour,
Je reviens sur ce sujet car j'ai un peu avancé mais il me reste encore des incompréhensions qui génèrent des erreurs (évidemment...)
Donc j'aurais la configuration suivante :
- un besoin d'analyser des données par différentes personnes, sur différents territoires, qui ne sont pas forcément très au fait des SIG/SGBD ==> création d'un batch
- plusieurs personnes susceptibles d'utiliser le batch, sur des machines PC Windows différentes ==> transmission du batch et des chemins + dossiers/fichiers à avoir sur sa machine (PC Windows)
- le serveur postgresql n'est pas commun ==> j'envisage de faire un tutoriel d'installation de postgresql (+PgAdmin) et d'améliorer le batch pour créer la bdd spatiale (donc PostGis) à chaque analyse ?=>? Est-ce possible ? Y-a-t-il un risque de dysfonctionnement d'un PC à l'autre ? Quel serait la base de cette ligne de code ?
Merci de vos retours/avis sur ce fonctionnement.
De plus, j'ai démarré le fichier .bat , avec l'aide des informations de jmarsac et du Net...
J'arrive à importer des shapes dans Postgres, et mon fichier sql (ensemble de requêtes d'analyses pour créer des tables et des vues) est également trouvé par le batch mais j'ai pas mal d'erreurs annoncées (a priori un problème d'encodage, sans certitude).
Pourtant, lorsque j'exécute ce fichier via PgAdminIII, tout se passe bien (import, remplacement, création tables et vues)
D'autant que via le batch j'ai tout de même quelques tables qui se créent avec ou sans enregistrement à l'intérieur (elles devraient toutes en avoir). Les erreurs semblent être souvent du même ordre. Pouvez-vous m'aider à améliorer le résultat ?
Au premier lancement du fichier sql via batch, j'ai ces erreurs :
Erreur 1 :
C:\Users\Public\Documents\BILAN\01_Etapes_bilan>"C:\Program Files\PostgreSQL
\9.5\bin\psql.exe" -h localhost -p 5432 -d postgres -U postgres -f "C:\Users\Pu
blic\Documents\BILAN\01_Etapes_bilan\00_requetes"\synthz_region_xxxx.sql
psql:C:/Users/Public/Documents/BILAN/01_Etapes_bilan/00_requetes/synthz_regi
on_xxxx.sql:68: ERREUR: erreur de syntaxe sur ou près de «  »
LIGNE 1 : 
^
Code : la première ligne du fichier sql synthz-region_xxxx.sql est une ligne de commentaire
-- Réalisé sous/avec PostgreSQL P.5 (...)
Erreur type 2 : Elle se répète sur plusieurs des tables que je veux créer
psql:C:/Users/Public/Documents/BILAN/01_Etapes_bilan/00_requetes/synthz_regi
on_xxxx.sql:1299: ERROR: syntax error at or near "DROP"
LIGNE 6 : DROP TABLE IF EXISTS schema.t00_historique_synthz CASCADE ;
^
Et est suivi directement par
psql:C:/Users/Public/Documents/BILAN/01_Etapes_bilan/00_requetes/synthz_regi
on_xxxx.sql:1315: ERROR: relation "t00_historique_synthz" already exists
Le code SQL :
DROP TABLE IF EXISTS schema.t00_historique_synthz CASCADE ;
CREATE TABLE schema.t00_historique_synthz AS
(SELECT ... etc...
Erreur type 3 qui se répète aussi sur plusieurs VUES que je veux créer :
psql:C:/Users/Public/Documents/BILAN/01_Etapes_bilan/00_requetes/synthz_regi
on_xxxx.sql:1411: ERROR: syntax error at or near "CREATE"
LIGNE 9 : CREATE OR REPLACE VIEW schema.v01_synthz_dept AS
^
Cette vue est créée avec le code SQL
CREATE OR REPLACE VIEW schema.v01_synthz_dept AS
(SELECT * FROM schema.t01_synthz_dept);
Un grand merci si vous avez un moment pour m'aider à solutionner / comprendre tout ça !
Re bonjour,
Ce n'est pas tout à fait la même demande mais je suspecte la même réponse (SQL dynamique) à la question suivante :
J'importe (copy) des fichiers csv qui représentent des extractions de données à date fixe (la date de l'extraction n'est pas indiquée dans le champ du fichier).
Est-il possible de récupérer une partie du nom du fichier csv (par exemple 20170422 sur 20170422_extraction_donnee.csv) importé pour le réinjecter dans les requêtes (par exemple en suffixe de noms de tables de résultats) ?
Si ce n'est pas possible, je ne vois que la possibilité de faire créer (manuellement) un champ dans le csv, avec la date de l'extraction, puis seulement d'importer le csv.
A moins qu'il y ait d'autre piste à explorer ?
Merci d'avance pour vos retours,
Merci à vous,
je regarde tout ça
Bonjour,
Je ne sais trop comment intituler ce post... Peut-être aurez-vous des idées avec le développement de mon problème ?
J'ai un ensemble de requêtes qui donnent des résultats sur un ou plusieurs départements de France. Je fais choisir les départements souhaités dans un csv que j'importe avec copy (cette table [choix_dept] sera la jointure de toutes mes requêtes).
Mes requêtes aboutissent à plusieurs tables de résultats, nommées de cette manière : "t01_nom_du_traitement".
Est-il possible d'ajouter les numéros des départements choisis au nom de la table pour avoir quelque chose comme ça "t01_nom_du_traitement_01_69_26_07" ?
J'ai démarré mes recherches en créant une table temporaire avec un enregistrement regroupant les numéros de département :
CREATE TEMP TABLE tempzone AS(select array_to_string(array_agg(tmpzone),'-') from (SELECT cast(insee_dep as varchar) FROM schema.choix_dept GROUP BY insee_dep) tmpzone);
et j'ai tenté (oui, je sais c'est plus que tiré par les cheveux) ça pour nommer la table...
CREATE TABLE schema.t01_nom_du_traitement_||tmpzone AS
(expression);
Ce qui me génère (évidemment) le message suivant :
ERROR: syntax error at or near "||"
LINE 1: CREATE TABLE roe.t01_nom_du_traitement_||tmpzone AS
^
********** Erreur **********
ERROR: syntax error at or near "||"
État SQL :42601
PS : je suis sous PostgreSQL 9.5
Bonjour,
Effectivement, le lien de jmarsac m'a remémoré quelques éléments !
Et j'en profite pour vous remercier vivement tous les deux pour vos réponses toujours très adaptées et explications vraiment très didactiques et claires !
Je vais me renseigner pour savoir s'il existe déjà un serveur SGBD unique pour plusieurs utilisateurs.
Mais aujourd'hui la configuration actuelle (et donc celle que j'imaginais utiliser) est :
- une personne transmet des données par messagerie (extraction d'une autre base, sous format csv et/ou shape)
- une personne les importe et les consomme sur sa machine, grâce au script. Cette personne peut différer selon le territoire voire la période. C'est pourquoi je demandais si tout était transposable à partir du moment où on gardait tous la même configuration des logiciels sur chaque machine = chaque machine est un serveur (postgres) et ses clients (psql/QGis)...
A ce sujet j'avoue être encore un peu perdue avec les utilisateurs windows et postgresql. Mais je pense que je reviendrais en temps voulu là dessus.
- par contre j'ai accès à un dossier dit "d'échanges" sur un serveur, et j'envisageais (selon les droits) de regrouper les fichiers à importer et exportés sur ce dossier, ainsi que le script si possible... Avec une ou plusieurs copies en local tout de même au cas où bien sûr.
Merci,
C'est génial !
Bon, je n'ai pas encore finalisé le script bat, mais j'ai démarré le fichier avec ce que vous m'avez indiqué et mes premiers apprentissages sur le web (si vous avez un très bon tuto, je prends avec plaisir).
Il me reste une incompréhension par rapport à ce .bat et les histoires de serveur/client. Pouvez-vous me confirmer ce que j'ai encore reformulé ci-dessous ?
- le serveur sera, sur toutes les machines, postgresql/postgis (même version que le mien car elle est précisée dans le fichier .bat) - et du coup le port sera également le même pour que ça puisse fonctionner
- les clients seront psql pour le traitement sql, et QGis pour l'affichage des vues géomatiques sur toutes les machines
- les fichiers à importer/exporter devront être sur toutes les machines dans le même dossier et chemin, accessible à tous les utilisateurs (par exemple C:\Users\Public\Documents\import\ et C:\Users\Public\Documents\export)
- le fichier .bat devra être lancé depuis... tout compte utilisateur des machines ou depuis le compte de l'administrateur ?
- le fichier sql devra préciser le nom des bases et des schémas pour qu'il s'exécute correctement ?
- le fichier sql devra utiliser \copy plutôt que copy ?
J'aurais une autre question concernant les fichiers .csv importés et traités (ils servent à faire quelques analyses et quelques mises à jours de tables de la bdd). Je la formule ici car elle est dans la continuité du projet, mais peut-être qu'il faudra que je la pose dans un nouveau sujet ?
J'ai plusieurs fichiers qui correspondent à des extractions régulières d'une base de données. Je cherche à actualiser ma propre base de donnée avec des traitements de ces fichiers. J'aimerai par exemple obtenir une synthèse (requête sql) de chaque fichier et regrouper les résultats en fonction de la date du fichier source :
id | date_extract | nb_condition1 | nb_condition2
1 | 2017-04 | 125 | 27
2 | 2017-01 | 100 | 29
...
Avec par exemple, deux fichiers d'extractions nommés 20170412_extract_ouv.csv et 20170122_extract_ouv.csv
-- Est-il possible de récupérer le nom du fichier (dans une variable ?) pour ensuite appliquer la requête sql ? Auriez-vous un exemple ?
-- Est-il possible d'importer plusieurs fichiers de ce type, tous enregistrés dans un seul et même dossier, mais tous avec un nom de fichier différent, pour leur appliquer ensuite la requête ? Auriez-vous un exemple ?
Merci encore de votre patience et de votre aide !
Bonjour,
Et merci à jmarsac et dverite pour ces éléments :
Pour l'import par SQL
- l'ajout de
SET lc_messages = 'C';
comme le proposais dverite est parfait, j'ai les messages d'erreur en anglais
- la récupération du fichier se fait sur le dossier "Public" de C:/ et ça fonctionne également
- j'ai bien précisé les colonnes dans le COPY comme jmarsac l'a spécifié, et pas de problème non plus : importation des données et autoincrement de l'idauto
- j'ai dû modifier le delimiteur, sans pourtant avoir changé le fichier csv... En tout cas il ne me semble pas !
- j'ai pu faire une extraction (COPY TO) sans problème dans les mêmes conditions.
Pour l'import / export via psql
Si je comprends bien, et je m'excuse par avance de la demande de confirmation sur des choses qui doivent vous sembler basiques... :
- Tout ce que je produit actuellement sur mon PC à l'aide de Postgresql/postgis, PgAdmin et QGIS (ainsi qu'avec mes fichiers shape et csv initiaux) ne pourra pas être reproduit (et donc les résultats de requêtes - tables ou vues ) par une autre personne sur un autre PC ?
Même si cette autre personne installe également Postgresql/postgis, PgAdmin et QGIS, et utilise un projet de QGIS qui charge les vues ?
Il ne pourra pas y avoir d'import/export des fichiers csv si le chemin est toujours C:\Users\Public\Documents par exemple ?
- Si ce n'est effectivement pas possible, d'après est-il "facile" de créer ce fameux script avec raccourci pour importer les fichiers ?
Ce script peut-il intégrer tout le travail de traitement codé en SQL (et qui permettrait un export de tables et de vues) ?
Ce script / raccourci peut-il être installé facilement sur n'importe quel PC ?
Faut-il également (je suppose que oui) que le PC ait Postgresql/postgis (et PgAdmin?)
Merci beaucoup pour votre aide,
Bonjour,
Merci pour les corrections et compléments d'information.
Pour le message d'erreur incomplet , je ne sais quoi faire car je n'ai rien changé à l'installation de Postgresql/PgAdminIII et surtout j'ai bien toutes les textes complets lors d'autres erreurs sur d'autres requêtes...
J'ai cherché un peu et j'ai l'impression que c'est bien paramétré dans les fichiers conf :
Dans tous les fichiers Postgresql.conf que j'ai trouvé, j'ai cet élément de code pour client_min_messages
#client_min_messages = notice # values in order of decreasing detail:
# debug5
# debug4
# debug3
# debug2
# debug1
# log
# notice
# warning
# error
Pour les droits utilisateurs
J'ai trouvé la commande psql (\du) pour avoir les informations sur les droits de l'utilisateur et voici ce que j'obtiens :
Liste des r¶les
Nom du r¶le | Attributs
| Membre de
-------------+------------------------------------------------------------------
---------------+-----------
postgres | Superutilisateur, CrÚer un r¶le, CrÚer une base, RÚplication, Con
tournement RLS | {}
Je suis donc bien en superutilisateur...
Mais peut-être n'est-ce pas la bonne solution compte-tenu de l'utilisation envisagée par la suite :
Je suis en train de créer une opération qui devra être réalisable par une tierce personne, sur un autre ordinateur, avec des fichiers mis à jour régulièrement : l'idée est de faire enregistrer les csv toujours au même endroit de chaque ordinateur et de les nommer selon les appellations utilisée dans la requête SQL ; afin de faire les importer et lancer la requête sur l'ensemble des tables présentent dans la base postgre/postgis (tables permanentes et nouvelles.csv) . je me pose quelques questions du coup sachant que les droits d'utilisateurs peuvent bloquer sur certaines requêtes :
** si je lis bien le message d'erreur complet de 42501, il faudrait utiliser la console psql pour s'en affranchir ; le hic c'est que ça ferait une manipulation de plus pour la tierce personne pas forcément initiée à ce type d'outil (et qui aurait déjà à utiliser PgAdmin et QGis en suivant un "tutoriel" à défaut d'avoir un SIGiste sous la main...)
** j'ai trouvé GRANT en cherchant un peu ; est-ce une piste à creuser pour contourner systématiquement les blocages ?
Qu'en pensez-vous ?
Merci
Bonjour à tous,
Je reprends ce fil après quelques jours de pose.
Merci pour vos réponses très claires, je comprends mieux les possibilités !
Alors, j'ai repris un test, en fonction de vos remarques mais je ne suis pas plus avancée.
- Je souhaite toujours importer un csv dans une table postgresql précédemment créée et ensuite incrementer un identifiant pour l'utiliser comme clé primaire (mon identifiant unique actuel est en varchar dans le csv).
- Ensuite, utiliser les champs x et y pour spatialiser le tout (j'ai déjà des tables spatialisées dans la base, que j'importe sous QGis)
Avec la requête suivante, j'ai une autre erreur qu'il y a quelques jours, toujours pas plus documentée (sous Query de PgAdminIII)
DROP TABLE IF EXISTS ouv."obstecoul_test" CASCADE ;
CREATE TABLE roe."obstecoul_test"
(
idauto SERIAL PRIMARY KEY,
identifian character varying(254),
statut_cod numeric(10),
statut_nom character varying(254)
) ;
DROP SEQUENCE IF EXISTS ma_sequence;
CREATE SEQUENCE ma_sequence INCREMENT 1 NO CYCLE;SET client_encoding = 'LATIN1';
COPY roe."table"
FROM 'C:\Users\dupont.dupond\Documents\OUV\bilan\table.csv'
WITH
CSV HEADER
DELIMITER ','
NULL 'NULL'
;UPDATE roe."obstecoul_test" SET idauto = nextval('ma_sequence');
********** Erreur **********
État SQL :42501
Si j'ai la bonne documentation, il s'agit de problèmes de droits d'écriture etc. ? J'ai cherché un peu mais j'avoue avoir du mal à comprendre quelles modifications à faire (entre client, serveur, postgresql, windows...)
- Quelles sont les manipulations à faire pour que les droits soient automatiques ? En effet, je prépare un petit outil pour des personnes encore moins initiées que moi, à utiliser sur d'autres PC de préférence après
- L'approche pour l'identifiant automatique est-elle la bonne ?
- Avez-vous de la doc simple pour spatialiser la couche ensuite via le SQL (je veux éviter les manipulations QGIS/PGADMIN aux prochains utilisateurs) ?
En vous remerciant ,
Bonjour,
Merci de vos réponses !
Je continue donc les échanges par point :
1- @gleu : je ne comprends par la votre demande ; le texte de l'erreur est complet... je n'ai qu'un code d'erreur pour ce problème.... J'ai effectivement eu plus de détails dans le cas d'autres erreurs mais pas là ... Y a t il une manipulation à faire pour obtenir ce que souhaité ?
2- @gleu et @ruizsebastien : merci pour l'astuce, après consultation de la doc je pense avoir compris comment faire ; je testerai dès que le point 1 sera réglé (ou en parallèle)
3- @gleu et @ruizsebastien : j'avais trouvé cette technique en cherchant un peu, mais je n'arrive pas à l'appliquer. Ca m'a occasionné pas mal d'erreurs. Comme c'est la première fois que je fais un import de CSV, j'ai préféré avancer et contourner en traitant le csv et en important ensuite toutes les colonnes...
y a t il des paramètres particuliers à vérifier ? Comme le nom des champs identiques entre Postgresql et csv (casse, nombre de caractères...), le traitement des champs vides (là je pensais avoir résolu), le format du fichier et de la base ? ...
Merci encore,
Bonjour à tous,
Je me forme petit à petit à postgresql en fonction des besoins... Donc ce n'est probablement pas la meilleure méthode pour éviter les erreurs, je l'admets.
Je souhaite faciliter certaines analyses bisannuelles sur ma base de données. Certaines données devront être mises à jour avant l'analyse. Pour cela j'aimerais faire des imports de csv via la requête sql.
J'ai trois demandes :
1 - J'ai solutionné pas mal d'erreurs au fur et à mesure de mes essais pour l'import mais là je bloque, je tourne un peu en rond entre deux erreurs, dont la dernière est la suivante :
État SQL :22P02
Sur la requête (création de table et import csv) suivante (simplifiée vu le nombre de champs...) :
DROP TABLE IF EXISTS roe."obstecoul_rmc" CASCADE ;
CREATE TABLE roe."obstecoul_rmc"
(
champ1 text,
champ2 numeric,
champ3 text,
...etc
geom geometry) ;
SET client_encoding = 'LATIN1';
COPY roe."table"
FROM 'C:\Users\Public\Documents\chemin\donnees_entrees\table.csv'
WITH
CSV HEADER
DELIMITER ','
NULL 'NULL'
;
Quelle(s) est(sont) les erreurs envisageables ?
Je suis d'ailleurs étonnée, je pensais que le csv avait comme délimiteur ";'...
Voici quelques lignes de mon csv (import via Notepad++)
champ1,champ2,champ3,champ4,champ5,champ6,champ7,champ8,champ9,champ10,champ11,x_l93,y_l93,champ14,champ15,champ16,champ17,champ18,champ19,champ20,champ21,champ22
DEG621,0,Validé en ser,2,Existant,BAR ,,1.2,Bar en rivière,,,884734.49,6735182.71,,,,,,IND,2009-07-17 14:36:50.737,2009-07-17 14:37:02.88,52
DEG626,0,Validé en val,2,Existant,Bar,,1.2,Bar rivière,,,884471.64,6735123.20,,,,,,IND,2009-07-17 14:30:50.769,2009-07-17 14:35:37.015,52
2/ Sur la base de cette requête, comment auto incrémenter/importer l'integer (identifiant unique "gid" sous Postgresql ?) sachant que le champ1 est bien un identifiant unique pour mes objets mais il est au format text ; il vaut mieux avoir un identifiant numeric, non ?
3/ J'ai pas mal cherché et j'ai cru qu'il était possible de n'importer que quelques champs du csv, par exemple en faisant bien correspondre les noms des champs du csv (header) avec ceux de la table créée ? Mais je n'ai pas trouvé l'astuce.
Ça me serait très utile pour éviter de traiter le csv (qui a 109 colonnes dont seulement une vingtaine à conserver pour cet exemple)...
D'avance merci de votre aide et conseils !
Pages : 1