PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 Re : Général » Exiger un mot de passe pour se connecter » 06/09/2013 13:48:11

Merci Bidou ! Ca fonctionne maintenant. smile

J'avais pas vu les lignes déjà décommentées, je les ai modifiées en conséquence.

#2 Général » Exiger un mot de passe pour se connecter » 06/09/2013 10:04:49

debutant_24
Réponses : 2

Bonjour.

Je suis sur archlinux, j'ai créé un utilisateur et modifié pg_hba.conf de façon à exiger un mot de passe pour me connecter. Le problème c'est que sur phppgadmin ou en passant par le terminal je peux me connecter sans mettre de mot de passe.

J'ai fait, sous psql :
ALTER USER postgres WITH ENCRYPTED PASSWORD 'mon_mot_de_passe';

J'ai édité pg_hba.conf :
# nano /var/lib/postgres/data/pg_hba.conf

en ajoutant :

local all postgres md5
host all postgres 127.0.0.1/32 md5

la version de psql est (9.2.4)

Que dois-je faire de plus pour qu'il exige le mot de passe à la connexion ? Merci !

#3 Re : Général » Compter le nombre d'apparition d'un caractère dans une chaine » 24/07/2011 15:50:58

le problème, c'est que je ne peux pas me permettre de modifier le texte qu'il y a dans le champs, sinon il ne veut plus rien dire sad

#4 Général » Compter le nombre d'apparition d'un caractère dans une chaine » 24/07/2011 14:22:23

debutant_24
Réponses : 3

Bonjour !

Je cherche depuis un moment un moyen de compter le nombre d'apparition d'un caractère dans une chaine avec une requête.

Par exemple sur la chaine :

'mais où est donc passée la regex ?'

je cherche le nombre d'apparition du caractère "e", et la requête me retournerai : 4

Si quelqu'un connait la technique pour obtenir ça ...

Merci !

#5 Re : Général » Performance d'une base / regex sur texte » 28/06/2011 11:33:47

Non, pas sur toute la table, voilà la structure :

Table COMPTE :

id | nom | prenom | ... | liste

Le champs LISTE est en type TEXT, ça donne à peu près cela :

<id58><1>nom</1><2>prenom</2></id58>
<id256><1>nom</1><2>prenom</2></id256>
<id9542><1>nom</1><2>prenom</2></id95428>
<id19><1>nom</1><2>prenom</2></id19>
...

le numéro dans la balise globale est celui de l'ID du contact du client (contact qui est aussi un client).

Par conséquent, quand j'applique une regex pour supprimer un contact de la liste du client par exemple, je sais exactement dans quel compte client il faut appliquer la regex, par exemple le compte client ayant pour ID = 654, puis, dans son champs liste je cherche avec la regex la balise globale contenant l'ID de son contact. La liste peut faire jusqu'à 60 ko soit environ 300 contacts listés en XML.

Les regexp sont donc appliquées sur un champs d'une ligne précise, déterminée par un ID précis : celui du compte client. Par contre au sein du champs LISTE de ce compte c'est un bloc de texte en XML donc la regex peut parcourir tout le texte de 60 ko (environ 300 lignes XML).

#6 Re : Général » Performance d'une base / regex sur texte » 27/06/2011 23:08:55

D'accord, mais je me suis dit qu'à l'affichage, il était plus simple pour le SGBD de faire une simple requête en SELECT sur le champs, pour ressortir toute la liste d'un coup, comme un bloc de texte, plutôt que d'utiliser les index pour rechercher chaque ligne une à une. Par contre dès qu'il faut ajouter, supprimer ou modifier un contact dans la liste, là c'est effectivement plus lourd à gérer à cause des regex.

Le fait est est qu'il y aura toujours plus d'affichage de liste que de modifications sur celle-ci, donc je voulais ménager l'affichage...

#7 Re : Général » Performance d'une base / regex sur texte » 27/06/2011 18:57:40

J'essaie de simplifier pour présenter mon problème, mais chaque client a une liste d'autres clients, une liste de contacts. C'est pour faire un réseau social.

L'énorme texte est situé dans un champs du compte client, c'est la liste de contacts du client, avec une mise en forme XML. Pourquoi ? Pour avoir tout dans la même ligne, pour éviter que les éléments de la liste de chaque client soient éparpillés dans une même table. A chaque ajout d'un contact sur la liste d'un client, il faudrait tout recalculer les index si la liste était présentée sous forme d'occurrences dans une autre table, alors que dans mon champs text avec la liste en XML dans la table compte,  je n'ai qu'à rajouter des balises à la fin de la liste pour ajouter un nouveau contact.

Voilà donc, il y a sans doute plusieurs solutions, mais difficile de trouver la plus optimale. Imaginez que sur 1 000 000 de clients, chacun dispose d'une liste de 50 contacts, cela ferait 50 000 000 de lignes dans la même table, c'est beaucoup ! Alors qu'avec la liste en XML dans un champs du compte du client, il y a toujours 1 000 000 de lignes. Mais bon, la présentation sous forme de balises XML demande sans arrêt des regexp sur champs text pour récupérer les informations sur un contact de la liste.

J'espère que je me suis pas trop mal expliqué smile

#8 Re : Général » Performance d'une base / regex sur texte » 27/06/2011 17:35:18

Oui c'est sur quoi j'étais parti au départ, mais le problème c'est que les lignes de tous les clients sont mélangées entre elles, donc il faut à chaque fois les trier.

En fait j'aimerai bien savoir comment le SGBD s'y prend à ce niveau, est-ce qu'il ajoute systématiquement les nouvelles occurrences à la fin du fichier de la table, puis il remet seulement à jour l'index, ou bien est-ce qu'il réécrit la ligne au bon endroit ? Et s'il écrit la ligne au bon endroit, j'imagine qu'il est obligé de recopier toutes les lignes en dessous pour les décaler sinon il risque d'écraser les lignes suivantes.

Sinon j'ai pensé aussi à faire une table par client, mais je sais pas combien de tables au maximum peut gérer postgresql, et s'il est pas plus difficile de retrouver les tables après, quand il y en a 1 000 000.

#9 Re : Général » Performance d'une base / regex sur texte » 27/06/2011 16:45:36

Le problème, c'est qu'il me faudrait une table imbriquée dans le champs d'une table, pour pouvoir gérer une liste propre à chaque client (chaque client possède une liste), mais on ne peut pas faire de table imbriquée.
Une solution serait de créer un tableau dans un champs, mais postgresql ne gère pas les array associatifs multidimensionnels.
Il reste l'ancienne solution : tout mettre dans une seule table, avec une clé qui serait l'ID du client pour chaque ligne de sa liste. Le problème c'est qu'à chaque fois qu'il rajoute une ligne à sa liste, il faut re-trier la table et recalculer les index pour placer l’occurrence au bon endroit dans la table, pour que ça donne à peu près ça :

ID|détails

26|aaaa
26|zzzz
26|cccc
26|rrrr
42|yyyy
42|cccc
99|zzzz
99|mmmm
...

Ça doit être assez lourd de tout re-trier à chaque fois, donc j'ai pensé mettre la liste de chaque client dans son occurrence dans la table compte, dans un champs, sous forme de XML :
<1>blabla</1><2>blibli</2><3>bloblo</3>

Donc en ce moment je cherche la technique qui soit la plus performante...

#10 Général » Performance d'une base / regex sur texte » 27/06/2011 16:07:24

debutant_24
Réponses : 12

Bonjour,

En ce moment je crée une base de données avec une table listant les comptes clients. Dans chaque compte j'ai 3 champs avec un gros texte de 60 ko chacun (26 000 caractères environ) , sur lesquels j'applique souvent des regex pour retrouver des phrases.

A votre avis,  pensez-vous que cela va trop ralentir le système, ou bien c'est jouable avec par exemple 1 000 000 de comptes ?

Merci !

#12 Re : Général » regexp_replace et sa regex » 24/06/2011 12:32:55

Merci, ça marche maintenant !

Par contre, je suis pas sûr de comprendre la troisième partie :

, E'\\1nnnn\\3');

Je présume que le \1 se rapporte au bloc de la première parenthèse du 2me élément et le \3 au bloc de la troisième parenthèse.
les \ sont doublés \\ pour ne pas être mal interprétés.

Mais j'ignore ce que signifie le E, j'ai jamais vu ça.

#13 Général » regexp_replace et sa regex » 23/06/2011 19:11:44

debutant_24
Réponses : 4

Bonjour, je suis nouveau et j'ai un problème avec la fonction regexp_replace :

je n'arrive pas à capturer une séquence précise au milieu d'une autre, dans le champs text "liste" de ma table "test".

voici le champs "liste" de la première occurrence, j'ai des données entre des balises et je cherche à remplacer le contenu de la deuxième balise contenue elle-même dans la balise <i74></i74> :

<i73><1>zzzz</1><2>bbbb</2><3>kkkk</3></i73>
<i74><1>aaaa</1><2>rrrr</2><3>mmmm</3></i74>
<i75><1>gggg</1><2>hhhh</2><3>xxxx</3></i75>

Je passe donc la requête suivante :

UPDATE test SET liste=regexp_replace(liste, '<i74>.*<2>(.*?)</2>.*</i74>', 'nnnn') WHERE id=1;

Normalement il devrait remplacer "rrrr" par "nnnn", mais à la place il efface toute la ligne <i74></i74> pour la remplacer par "nnnn". Il ne semble pas prendre en compte les parenthèses.

Pourtant, la même regex avec la requête suivante renvoie bien le contenu de la balise <2> dans <i74> :

SELECT SUBSTRING(liste FROM '<i74>.*<2>(.*?)</2>.*</i74>') FROM test WHERE id=1;

résultat : "rrrr"

Comment faire comprendre à postgresql que je souhaite remplacer seulement le contenu de la balise <2> dans <i74> ?

Si quelqu'un a une idée... merci pour votre soutien !

Pied de page des forums

Propulsé par FluxBB