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 07/02/2024 13:33:50

Shonenboi
Membre

DOMAIN avec regex

Bonjour ! Je suis actuellement en train de renforcer mes connaissance en bdd et je rencontre un souci avec les DOMAIN et je créer tout mes scripts en utilisant sqitch, je m'explique.
J'ai une table "file" qui à un champ "media_picture_url", dans lequel j'y mettrais des lien vers des images en ligne. J'ai donc crée la tables avec ses champs, et dans un autre script j'y ai mis cela:

CREATE DOMAIN url_checker as TEXT
    CHECK (
        VALUE ~ '^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_.+~#?&\/=]*)$'
    );

ALTER TABLE "file"
    ALTER COLUMN "media_picture_url" TYPE url_checker;

La création de la table fonctionne, l'ajout du domaine aussi, hors, lorsque je veux insérer un lien dans le champs en question, postgres me renvoi l'erreur suivante:

ERREUR:  la valeur pour le domaine url_checker viole la contrainte de vérification « url_checker_check »

J'ai évidement essayé plusieurs url différente, j'ai d'ailleurs également testé la regex sur regex101 ainsi que tout les liens que je voulais insérer dans ma bdd, je bloque...
Merci d'avance ! big_smile

Hors ligne

#2 12/02/2024 23:19:38

dverite
Membre

Re : DOMAIN avec regex

\b dans la regex correspond dans Postgres au caractère de code 8 (backspace), qui n'a pas de raison d'être dans une URL (qui est probablement illégal dans une URL d'ailleurs vu que c'est un caractère de contrôle).
cf la doc: https://www.postgresql.org/docs/current … ching.html

Table 9.20. Regular Expression Character-Entry Escapes
Escape     Description
\a     alert (bell) character, as in C
\b     backspace, as in C

En revanche dans Perl \b correspond à une limite (boundary), cf https://perldoc.perl.org/perlrebackslas … 7D%2C-%5CB

Moralité vous essayez une expression régulière qui marcherait sûrement avec Perl mais non compatible avec Postgres.

La doc de Perl ci-dessus dit que \b est équivalent à

(?:(?<=\w)(?!\w)|(?<!\w)(?=\w))

donc vous pouvez essayer de remplacer par cette séquence.

Hors ligne

Pied de page des forums