Vous n'êtes pas identifié(e).

#176 Re : Général » Passage de paramètre dynamique dans le Crosstab? » 24/09/2018 18:03:21

Du point de vue du SQL toute la partie entre $$ et $$ est une chaîne de caractères en dur. S'il y  un paramètre $P{YEAR} il est doit être interprété par l'outil côté client et sa valeur doit être injectée dans la chaîne avant de la passer au moteur SQL.


Au vu de l'erreur ce n'est pas comme ça que l'outil procède, il semble vouloir un "vrai" paramètre au sens des requêtes paramétrées au niveau SQL.


Il est possible d'en faire un vrai paramètre mais il faudrait le sortir de la chaîne litérale et la découper en 3 parties avec un syntaxe du style:

concat($$ SELECT ... WHERE to_char(DateAcct,'YYYY') = $$ , $P{YEAR}, $$ ORDER BY ... $$)

#177 Re : Installation » connection local pour pgagent et pgadmin4 » 21/09/2018 16:56:07

"Permission denied" sur une connexion TCP est toujours du fait de SELinux .
Il faut configurer quelque part que pgAdmin a le droit de faire du réseau.

Si c'est pgAdmin4 à travers un serveur apache ça doit être

# setsebool -P httpd_can_network_connect 1

#178 Re : Général » Import de fichiers de type CSV à partir de psql » 21/09/2018 16:38:09

Le E devant une chaîne de caractères indique que l'antislash dans cette chaîne est un caractère d'échappement, sinon c'est un caractère normal (enfin sauf si standard_conforming_strings est à OFF mais en postgres moderne, il devrait être à ON).


Dans la doc c'est décrit ici: https://docs.postgresql.fr/10/sql-synta … ngs-escape

#179 Re : Général » Import de fichiers de type CSV à partir de psql » 21/09/2018 15:40:52

Le format CSV est défini (rétrospectivement) via 7 règles dans une RFC ici: https://tools.ietf.org/html/rfc4180 .


Si le fichier utilise des guillemets librement, c.a.d sans tenir compte du fait que c'est un caractère d'encadrement, il ne respecte pas les règles #5 et #7 de la spécification, donc ce n'est pas du CSV, c'est juste des champs séparés par un caractère, et on compte sur la chance ou sur une règle métier autre pour que les contenus ne comprennent ni ce caractère, ni des sauts de ligne (puisque l'encadrement via guillemets sert justement à gérer ces cas).


Pour l'importer quand même avec \copy, je pense qu'il faut spécifier un caractère de QUOTE qui n'est jamais utilisé dans le fichier. Il faut en plus qu'il fasse partie du jeu ASCII, donc un caractère de contrôle comme par exemple E'\001' ou E'\b' (code 8) pourraient faire l'affaire.

\copy nomdetable FROM stdin (format csv, quote E'\b')

#180 Re : Général » Fonction de fenêtrage » 19/09/2018 15:38:53

Vous pouvez utiliser LEAD avec un fenêtrage, qui donne la valeur d'une colonne sur les lignes suivantes par rapport à un ordre spécifié explicitement.

Par exemple:

SELECT autres colonnes,
  lead(count_row,1) over(w) as suivant1,
  lead(count_row,2) over(w) as suivant2,
  lead(count_row,3) over(w) as suivant3
FROM table
WINDOW w AS (ORDER BY date)

La condition que vous voulez est satisfaite quand suivant1 et suivant2 et suivant3 sont tous à zéro.

Attention au fait que LEAD(colonne, N) renvoie NULL quand le décalage N sort des limites du jeu de données.

#181 Re : pgAdmin4 » Création de serveur sous pg admin 4 » 13/09/2018 13:19:30

Côté serveur PostgreSQL, c'est par opposition au côté client qui est pgAdmin4.

La configuration serveur en général via le fichier postgresql.conf est décrite ici:
https://docs.postgresql.fr/10/runtime-config.html


La page qui mentionne spécifiquement ce paramètre lc_messages:
https://docs.postgresql.fr/10/runtime-c … lient.html

#182 Re : Optimisation » Temps d'execution d'un update très long - est-ce normal ? » 05/09/2018 14:35:24

Que les temps d'exécution soient très variables peut aussi venir du fait que le sous-système disque serait virtualisé.

C'est facile à gérer pour les admins (peut-être que le doublage de taille de la partition a juste consisté à bouger une réglette dans une interface?) mais les performances sont imprévisibles puisque les disques physiques sont partagés par plusieurs machines virtuelles.

Même sur un système disque dédié, les temps sont variables, pour bien faire il faut enchaîner entre 5 et 10 exécutions du test et considérer le temps médian comme résultat.

#183 Re : Optimisation » Temps d'execution d'un update très long - est-ce normal ? » 27/08/2018 12:54:01

Si le sous-système disque n'est pas un foudre de guerre, une trentaine de mn pour un UPDATE de 10M lignes n'est pas spécialement choquant.


Vous pouvez regarder un peu ce que fait le système pendant ce temps avec des outils de supervision système et Postgres, mais il faut bien voir que cet UPDATE massif va créer une copie de chaque ligne de la table, et pas forcément dans le même bloc s'il ne trouve pas de place, ça dépend des écritures précédentes dans la table et du fillfactor. Et s'il y a des index sur cette table,  il va doubler aussi chaque entrée d'index. Là aussi le fillfactor entre en ligne de compte. Postgres va également écrire dans les fichiers journaux WAL en plus des fichiers de relation, soit deux fois plus d'écritures.


Au final un UPDATE global sur une table peut tout à fait engendrer l'écriture de N fois la taille initiale de la table.

#184 Re : PL/pgSQL » Sélectionner uniquement les lignes de l'année » 22/08/2018 16:28:34

Si la colonne est de type timestamptz ou timestamp.


Méthode qui tire partie de l'index s'il y en a un sur cette colonne:

SELECT * FROM table
 WHERE colonne_date >= '2017-01-01'::date
   AND colonne_date < '2018-01-01'::date;

Méthode peut-être plus intuitive mais  généralement moins efficace par rapport à un index:

SELECT * FROM table
 WHERE date_part('year', colonne_date) = 2017

#185 Re : Général » integer, bit ou bytea ? » 06/08/2018 16:12:23

Vous pouvez utiliser vos propres fonctions si ça vous simplifie le portage.
Avec la convention de numérotation des bits de 0 à 31 en partant de la droite:

CREATE FUNCTION set_bit(valeur int4, numbit int4) RETURNS int4
AS ' SELECT valeur | (1 << numbit)'
LANGUAGE SQL  IMMUTABLE;

CREATE FUNCTION get_bit(valeur int4, numbit int4) RETURNS int4
AS ' SELECT ((valeur & (1 << numbit))>>numbit)&1'
 LANGUAGE SQL  IMMUTABLE;

Attention au fait que les entiers sont signés avec PostgreSQL via le bit 31.


Concernant les différences entre bytea et bit(n)/varbit(n), le premier n'est pas spécialement fait pour gérer des champs de bits alors que les deux autres oui. Il y a plein de fonctions et opérateurs qui prendront du bytea et pas du bit/varbit et inversement.
Les valeurs bit(n) sont  représentées pour les entrées/sorties en séries de 0 et 1 alors que les bytea sont en octets, avec d'ailleurs plusieurs formes possibles.

#186 Re : Installation » [barman]PostgreSQL streaming: FAILED (fe_sendauth: no password supplie » 25/07/2018 17:37:00

J'arrive a me connecter sans pgpass avec le userbarman postgre ou root est ce normal ?? j'ai même supprimé le pgpass.

Oui ça a l'air normal si les connexions viennent de 192.168.103.191 , et au passage le pg_hba.conf est illogique:

host    all             all             192.168.103.191/32      trust
host    all             postgres        192.168.103.191/32      trust
host    all             barman          192.168.103.191/32      md5


En 1ere ligne, ça dit "toute connexion venant de 192.168.103.191 est autorisée sans mot de passe, pour toute base (all) et pour tout utilisateur (all).

La 2eme ligne dit la même chose mais uniquement pour l'utilisateur postgres, sauf que le pg_hba.conf applique les règles dans l'ordre et donc la 1ere ligne gagnera toujours.

La 3eme dit que l'utilisateur barman doit envoyer son mot de passe (md5) sauf que pour les mêmes raisons cette ligne n'aura jamais aucun effet,  la ligne 1 étant prioritaire.

#187 Re : Site PostgreSQL.fr » Commandes Ubuntu pour CentOS/Red Hat » 12/07/2018 20:18:35

Une  option plus simple serait peut-être de s'installer une VM Debian ou Ubuntu, où les commandes de votre formation seront directement applicables.

#188 Re : Général » [PostgreSQL 9.6.9] dump d'une table » 10/07/2018 13:15:04

il faudrait exporter et importer séparément la structure et les données, pour éviter de passer la recherche/remplacement sur les données, qui est coûteuse mais aussi dangereuse (si le contenu recherché s'avère être présent dans les données par coïncidence).


Voir les options de pg_dump --schema-only et --data-only

#189 Re : Général » droit du redémarge service postgresql » 09/07/2018 11:58:40

Regardez la commande sudo.
Elle utilise un fichier qui permet de configurer le fait que certains utilisateurs ont le droit de lancer certaines commandes en tant que root.

#190 Re : Général » Différence entre OID et UUID » 25/06/2018 13:46:14

l'OID est un nombre de 4 octets, utilisé en entier non signé et dont les valeurs vont de 0 à (2 puissance 32)-1 (=4294967295)

L'UUID n'est pas un concept propre à postgres, il correspond à une norme décrite par exemple ici:
https://fr.wikipedia.org/wiki/Universal … Identifier

La différence la plus évidente est qu'il comporte 16 octets, donc il prend 4 fois plus de place mais peut représenter 2 puissance 128 valeurs.

#191 Re : Général » faut-il une transaction ? » 25/06/2018 13:32:41

Oui en l'absence de transaction explicite, il y a une transaction implicite par requête. De ce fait, un bloc BEGIN/COMMIT entourant une seule requête est inutile.

En cas de plantage pendant la requête, le "morceau" de requête ayant été exécuté avant le plantage ne laissera aucun résultat dans la base de données, c'est comme si la requête n'avait pas eu lieu, à part pour les appels à nextval() qui ne sont pas transactionnés.

#192 Re : PL/pgSQL » Analyse sur plusieurs champs » 19/06/2018 22:38:06

La table matrice_total_test est dépivotée ce qui va dans le bon sens, mais la forme de ces données (enfin à supposer que  je comprends ce qu'elles représentent) est telle qu'il y aurait 2 dépendances:

id de polygone=> geom
(id de polygone, année) => valeur


D'un pt de vue un peu théorique, le fait d'avoir ces données dans la même table  matrice_total_test est une violation de la 2eme forme normale.
Les formes normales sont décrites par exemple ici:
https://fr.wikipedia.org/wiki/Forme_nor … ionnelles)

Le problème que geom ne dépend en rien de l'année est similaire structurellement à l'exemple wikipedia avec (Produit, fournisseur, Adresse fournisseur).

#193 Re : Général » [RESOLU]requete sur un champs jsonb » 18/06/2018 13:59:51

Dans les 2 exemples montrés, champjson commençe par un crochet, qui signale le début d'un tableau.

C'est un tableau contenant un objet alors que la notation champjson->'d' retourne un champ d'un objet, pas d'un tableau d'objets.

Moralité il faut commençer par sortir l'élement du tableau, par exemple avec la fonction json_array_elements()

 select json_array_elements($$[{"a": "", "b": "", "c": "", "d": [19, 38, 34, 13], "e": ""}]$$)->'d';
     ?column?     
------------------
 [19, 38, 34, 13]

#194 Re : Général » erreurs make » 15/06/2018 18:29:25

Je pense que pour avoir cette erreur il faut un mélange de sources compilées avec openssl et sans openssl.

Pour corriger, il faudrait nettoyer le répertoire de compil avec un "make distclean" à la racine des source
et ensuite lancer à nouveau le configure et le make.

#195 Re : Général » erreurs make » 14/06/2018 18:35:24

Il faut remonter plus haut dans les messages d'erreur de make. Là on voit simplement qu'il y a eu un problème pendant la compil de libpq, mais pas le message d'erreur lui-même.

Par ailleurs /u01/app/PostgreSQL-10/lib/libpq.so.5.10 est certainement issu d'un "make install" précédent, probablement sans openssl.

#196 Re : PL/pgSQL » Analyse sur plusieurs champs » 12/06/2018 14:52:15

Le souci avec les années en colonnes, c'est que ça ne respecte pas le modèle relationnel. Dans ce modèle on a des relations (=tables), des attributs (=colonnes) et des valeurs (=contenu des colonnes)

Or "typeannée2016" n'est pas un attribut. Par contre "année" est un attribut, et 2016 est une valeur possible de cet attribut. Et sans trop savoir ce que désigne "type" , ça  a l'air d'être un attribut, et "type_1" est une valeur possible de cet attribut

Concrètement dans le modèle relationnel ces données pourraient être avoir cette forme:

TABLE polygone(
 id int PRIMARY KEY,
 geom geometry
)

TABLE mesure(
  id int REFERENCES polygone(id),
  annee int,
  valeur varchar 
);

avec éventuellement un index unique sur le couple (id,annee) parce que la valeur est fonction de (id,annee).
Cette structure permet d'accueillir de nouvelles années sans changer les colonnes, mais surtout d'être requêtée en SQL parce qu'elle est alignée avec la logique relationnelle.

Ce qui ne veut pas dire que les requêtes vont être forcément simples à élaborer, tout dépend des questions auxquelles elles doivent répondre, mais qu'au moins toutes les fonctionnalités du SQL seront utilisables directement.

#197 Re : Général » connexion depuis un autre serveur » 09/06/2018 15:20:45

"Connection refused" est un message de la couche réseau indiquant qu'il n'y a pas de service qui écoute à l'adresse IP et au port indiqués.
Généralement c'est dû au fait que le serveur distant n'est pas configuré pour écouter l'interface réseau sur laquelle la connexion arrive.

Dans postgresql.conf, c'est le paramètre listen_addresses qui dit quelles interfaces réseaux doivent être écoutées par le service. Par défaut c'est uniquement localhost ce qui interdit effectivement les connexions distantes.

#198 Re : Installation » MAXSTRLEN dans ts_parser » 09/06/2018 14:44:13

Une approche plus orthodoxe serait de faire un dictionnaire personnalisé qui éliminerait les léxèmes dépassant la longueur en question, qui peut d'ailleurs être un paramètre du dictionnaire.


L'inconvénient c'est qu'il faut le faire en C. Mais si vous en êtes à recompiler postgres, ce n'est pas forcément un problème.


Le code à produire est très simple en s'inspirant de  src/backend/tsearch/dict_simple.c.

Les exemples dans contrib dict_int, dict_xsyn permettent aussi de voir comment packager ça dans une extension avec les déclarations de dictionnaire qui vont bien.

#199 Re : Général » Aide pour crosstab » 07/06/2018 14:23:40

Décidément le crosstab est à la mode en ce moment smile

Dans votre exemple c'est le contraire, vous voulez dé-pivoter. Les fonctions crosstab() ne font pas ça.
S'il n'y a que 3 colonnes, ça peut être fait à la main avec 3 Select combinés avec UNION ALL, sinon la méthode générique mentionnée à la fin de ce billet peut faire l'affaire aussi:

http://blog-postgresql.verite.pro/2018/ … pivot.html

#200 Re : PL/pgSQL » Syntaxe/sous-requête WHERE dans un CROSSTAB » 07/06/2018 14:15:59

Merci pour le retour positif sur les pivots dynamiques!

Sur ce problème

comme AVG(SUM(ST_AREA()) -> aggregate function calls cannot be nested

typiquement il faut imbriquer les calculs en sous-requête, du style:

 SELECT avg(s.v) FROM (select sum(valeur) AS v FROM table GROUP BY qqch) AS s;

Les requêtes les plus complexes peuvent avoir beaucoup de niveaux d'imbrication, et mentalement on conçoit ces niveaux d'imbrication séparément pour arriver à comprendre ou produire ces requêtes.


Pour la question sur choisir Rstat ou des solutions équivalentes ou SQL, personnellement n'y connaissant rien en statistiques, je ne me rends pas vraiment compte de ce qu'on fait avec et si c'est mieux ou non.

En regardant la procédure de Sotos sur  https://forums.postgresql.fr/viewtopic.php?id=4478 ce qui me paraît notable c'est que pour son traitement toutes les colonnes numériques d'une table se valent. C'est-à-dire que sa procédure va calculer un paquet de statistiques sur les colonnes sans s'occuper de savoir si c'est un nombre de personnes, une durée en secondes, une taille, une surface... Cette manière d'aborder les données est plutôt étrange du point de vue du mode de pensée relationnel, dans lequel chaque colonne a un sens individuellement, et donc l'idée de considérer les colonnes de manière générique sort du cadre naturel.

Pied de page des forums

Propulsé par FluxBB