Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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
Salut, je vois que tu as tout de même des fonctionnalités assez complexes .
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
Je ne peux pas utiliser l'ORM de doctrine, je me limite à la couche DBAL .
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
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 :
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
up
Hors ligne