Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 13-06-2013 07:42:48

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

[DBAL] MySQL & PostgreSQL

Bonjour,

Dans le contexte de mon application, un utilisateur peut soit créer une base de données sous MySQL ou sous PostgreSQL.
Je rencontre des problèmes de compatibilité entre les deux SGBDR à travers la syntaxe des commandes SQL suivantes:

- LIKE(MySQL) vs ILIKE(PostgreSQL) => Pour de l’auto-complétion, je ne peux pas utiliser l'opérateur simple LIKE sous PostgreSQL car j'ai besoin qu'il ne tienne pas compte de la casse.

- GROUP_CONCAT(MySQL) vs STRING_AGG(PostgreSQL) => pour de la concaténation

- LOAD DATA(MySQL) vs COPY(PostgreSQL) => pour l'intégration de fichier en base de données

- etc....

Comment puis-je procéder?

J'ai quelques solutions telles que:

- Au moment de la création de ma requête je fais un switch/case sur mon type de drivers (MySQL/PostgreSQL), mais cette solution ne me convient pas car je veux pouvoir réutiliser ces fonctionnalités à souhait.
- Créer un service qui sera appeler juste avant l'execution de ma requête, et qui en fonction du drivers connecté fera un str_replace, pour remplacer par exemple mon LIKE de MySQL par ILIKE si je suis sous PostgreSQL, mais je ne sais comment procéder...


Merci par avance.

Dernière modification par adloiseau (13-06-2013 07:47:46)

Hors ligne

 

#2 13-06-2013 09:50:50

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [DBAL] MySQL & PostgreSQL

Salut, je vois que tu as tout de même des fonctionnalités assez complexes smile.

J'aurai envie de t'orienter vers Doctrine qui est peut être capable en fonction de l'entity manager que tu vas utiliser de modifier sa syntaxe. De cette façon tu écrirais du DQL et l'ORM se charge du reste.

Sinon tu pourrais voir pour étendre ta partie "ORM" pour y ajouter une surcouche qui est capable de gérer ce dont tu as besoin.

Sinon la solution d'un switch me parait pas complètement bête bien que ça implique d'autres contraintes comme tu le cites.

Hors ligne

 

#3 13-06-2013 10:12:31

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

Re: [DBAL] MySQL & PostgreSQL

Je ne peux pas utiliser l'ORM de doctrine, je me limite à la couche DBAL sad.
Les fonctionnalités de mon application m'oblige à travailler avec une connexion dynamique, soit, une base de données de référence fixe et créée à l'installation de l'application, et des bases de données créées à la volée par les utilisateurs. De plus mes bases de données créées à la volée sont liées à ma base de données de référence.

Dernière modification par adloiseau (13-06-2013 10:13:03)

Hors ligne

 

#4 13-06-2013 10:35:05

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

Re: [DBAL] MySQL & PostgreSQL

Mon architecture est organisée telle que :

- Controller
- Entity
- Factory ( j'instancie mon service et mon repository lié )
- Service
- Repository ( sous couche de service dans laquelle j'écris mes requêtes, je n'ai pas accès au serviceLocator )

Exemple d'une fonction getList() de mon repository :

Code:

    public function getList($start, $limit, $millesime, $queryWords)
    {
        $query  = "SELECT * ";
        $query .= "FROM {$this->kern}.programme ";
        $query .= "WHERE programme.millesime = ";
        if (!empty($millesime)) {
            $query .= "'{$millesime}' ";
        } else {
            $query .= "( SELECT programme.millesime ";
            $query .=   "FROM {$this->kern}.programme ";
            $query .=   "ORDER BY programme.millesime DESC LIMIT 1 OFFSET 0 ";
            $query .= ") ";
        }
        if (!empty($queryWords)) {
            $query .= "AND code_programme LIKE '{$queryWords}%' ";
            $query .= "OR  libelle_programme LIKE '{$queryWords}%' ";
        }
        $query .= "ORDER BY code_programme ";
        $this->countQuery = $query;
        $query .= "LIMIT {$limit} OFFSET {$start}";
        $stmt = $this->connection->prepare($query);
        $stmt->execute();

        $programmeList = array();

        $rows = $stmt->fetchAll();

        foreach($rows as $row) {
            $programme = new Programme($row) ;
            $programme->codeLib = $row['code_programme'].' - '.$row['libelle_programme'];
            $programmeList[] = $programme;
        }

        return $programmeList;
    }

Mon problème à ce niveau est que si je suis sous PostgreSQL, je dois transformer mon LIKE en ILIKE, je pourrais très bien switcher sur le type de drivers mais pour rappel je ne veux pas et il faudrait que je le fasse partout où j'utilise des contradictions entre les deux SGBDR..
Du coup j'aimerais pouvoir faire si c'est la meilleur solution, un switch/case sur mon driver avant l'écriture de ma requête de type MySQL ou PostgreSQL, mais je ne sais pas où m'attacher et comment...

Hors ligne

 

#5 20-06-2013 13:25:49

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

Re: [DBAL] MySQL & PostgreSQL

up

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages