Il y a plusieurs bibliothèques de constructeur de requêtes de style ActiveCord. Certains sont Stand seul et certains viennent intégré à des cadres . Cependant, ils ont vraiment des problèmes avec où et ayant des clauses en matière de SQL complexe. Définir d'autres bases de données à part - J'essaie de proposer une méthode compatible MySQL et PostgreSQL dans laquelle () la méthode qui pourrait corriger ces inconvénients méthodes actuelles.
Ce qui suit est une longue liste d'idées et d'exemples montrant le mieux que je pourrais proposer jusque là. Cependant, je ne peux pas sembler résoudre tous les cas d'utilisation em> et je sens que ma solution partielle est bâclée. Toute personne qui peut répondre avec quelque chose qui résout tous ces problèmes répondra non seulement à cette question - mais une volonté sera responsable de la correction d'un problème qui a chassé des implémentations de PHP depuis plusieurs années maintenant. P> opérateurs communs strong> p> Exemple où les clauses forte> p> Il existe de nombreux formats d'Activerecord communs que la clause où () utilise dans les différents em> les bibliothèques actuelles em>. p> voici le format final que j'ai jusqu'à présent. Il devrait gérer le regroupement (...) et (...) code> ainsi que les paramètres liés de l'état préparé ("?" & ": Nom"). P>
function where($column, $op = '=', $value = '?', $group = FALSE){}
// Single line
$this->db->where('column > 5');
$this->db->where('column IS NULL');
// Column + condition
$this->db->where('column', '=');
// WHERE column = ? (prepared statement)
$this->db->where('column', '<>');
// WHERE column <> ? (prepared statement)
// Column + condition + values
$this->db->where('column', '=', 5);
// // WHERE column = 5
$this->db->where('column', 'IN', '(SELECT column FROM t2)');
// WHERE column IN (SELECT column FROM t2)
$this->db->where('column', 'IN', array(1,2,3));
// WHERE column IN (1, 2, 3)
$this->db->where('column', 'NOT IN', array(1,2,3));
// WHERE column NOT IN (1, 2, 3)
// column + condition + values + group
$this->db->where(
array(
array('column', '<', 20),
array('column', '>', 10)
),
NULL,
NULL,
$group = TRUE
);
// WHERE (column < 20 AND column > 10)
5 Réponses :
API SQLALCHEMY est le meilleur que j'ai travaillé jusqu'à présent. C'est une bibliothèque Python, mais vous pouvez toujours en être inspiré. Ce n'est pas seulement pour les clauses --- Toute la requête SQL (que ce soit une sélection ou un DML) est exprimée avec une structure de données facilement modifiable. P>
(Je parle de son SQL-Toolkit, pas des parties ORM.: -) p>
N'EST PAS ÊTRE UN DEV DE PYTHON J'ai un peu de difficulté à suivre l'API lorsqu'il s'agit de la [Structure de la clause] [1]. Souhaitez-vous ajouter un exemple à votre question? [1]: sqlalchemy.org/ Docs / 05 / Référence / Sqlalchemy / ...
J'ai travaillé un peu sur la bibliothèque PHP est un langage de script qui analyse et compile le code sur chaque demande (sauf si vous utilisez un cache de bytecode). Donc, l'environnement PHP est sensible aux bibliothèques de code volumineux - plus que Java ou C # ou Python ou qu'avez-vous. C'est donc une priorité élevée de garder des bibliothèques comme maigre que possible. p>
Tous les Les expressions SQL suivent une grammaire générative plus compacte et plus facile à lire et à conserver que l'une de la construction à base de PHP que vous avez montrée. Apprendre la grammaire d'expression SQL est beaucoup plus facile que d'apprendre une API qui peut le simuler. Vous finissez par soutenir une "grammaire simplifiée". Ou sinon vous commencez ainsi et vous retrouvez avec votre communauté d'utilisateurs dans Fonction Creep jusqu'à ce que Votre API est inactilement complexe. P> LI>
déboguer une application utilisée une telle API, vous avez inévitablement besoin d'accéder à l'expression SQL finale, il s'agit donc de la l'abstraction la plus fuite Vous pouvez avoir. p> li>
Le seul avantage à utiliser une interface à base de PHP pour les expressions SQL serait qu'il aide le code-achèvement dans les éditeurs intelligents et les IDE. Mais lorsque beaucoup d'opérateurs et d'opérandes utilisent des constantes de chaîne comme Vous pourriez aussi regarder le DBIX de Perl :: Classe, mais cela finit par être assez moche. P> zend_db code>, qui inclut un PHP classe pour la construction de requêtes SQL . J'ai décidé de tenter de gérer chaque syntaxe SQL imaginable dans
où code> et
ayant code> clauses, pour plusieurs raisons: p>
zend_db code> J'ai travaillé sur environ 2 000 lignes de code PHP. En revanche, Java Hibernate est de l'ordre de 118k lignes de code. Mais ce n'est pas tellement un problème car une bibliothèque Java est précompilée et ne doit pas être chargée sur chaque demande. P> LI>
'> =' code>, vous gâchez une intelligence d'achèvement du code. P> li>
ul>
J'ai le sentiment que ton droit. Plus nous essayons de résumer certaines choses, plus notre travail peut devenir plus difficile. Un cas à titre est l'utilisation forcée de BBCode, du textile ou du marquage, car les programmeurs ne voulaient pas filtrer correctement HTML.
Je pensais que des formats de balisage simples existent car les utilisateurs typiques ne peuvent pas équilibrer leurs balises HTML. :)
En fait, vous * avez * code> à
[b] balance [/ b] code> votre
Je m'interroge sur votre avis sur l'idée de la bibliothèque PHP qui gère la syntaxe SQL, à l'aide de l'extension de l'opérateur PECL et du sucre syntaxique. Je fais face à un problème similaire maintenant, décidant d'utiliser où code> ou
ayant code> pour gérer
chaque syntaxe SQL imaginable code> et leur performance frappe. Peux-tu m'aider avec ceci?
@khael, la question du sucre syntaxique est différente de la question de l'optimisation des performances. Le premier peut aider à accélérer la productivité des développeurs (et partage cet objectif avec des solutions ORM), mais celle-ci se concentre sur l'efficacité de l'exécution. Ce sont deux objectifs distincts et il est difficile de trouver une solution qui répond à la fois des objectifs.
J'apprécie vraiment votre réponse, comme une dernière demande, je dois vous demander de vérifier cette question et de laisser un commentaire si vous avez des idées qui pourraient aider: Stackoverflow.com/questions/17949237/... . Je ne sais pas si cela est approprié de moi pour laisser cela dans un commentaire, mais si nécessaire, je vais le supprimer. Merci encore.
Cela fait partie de ma classe d'activeCord, je ne traite pas de sous-demandes (je ne me dérange même pas): une autre chose que vous pourriez envisager est d'avoir une fauve de tête ( ) et personnaliser les méthodes (). p> p>
Merci d'avoir partagé. Cependant, des choses comme entre? Et? Code>, fonctions, opérations groupées
(ou (? Et (? Et?)) Code>, ne fonctionnent pas non plus.
Jetez un coup d'œil à ma question quelque peu liée: Stackoverflow.com/questions/1332217/backticking- MySQL-ENTITITIS Peut-être que vous pourriez implémenter une chose similaire à la méthode citation ().
Je sais que c'est une affichage extrêmement ancienne, mais je vais y répondre de toute façon, car je suis en train de développer mes propres classes pour répondre à des besoins similaires à la question de la question.
Après avoir regardé Dans cela, j'ai constaté que le problème avec Zend-DB et d'autres moteurs de ce type est qu'ils essaient d'être toutes des choses à toutes les personnes. Faire appel au plus grand public, ils doivent offrir la fonctionnalité la plus générale, qui devient leur propre défaillance, autant que je puisse voir (et aussi expertiellement expliquée par Bill Karwin). P>
L'un des plus évidents -Complications que de nombreux moteurs font, consiste à confondre la génération de code SQL avec son exécution (ce qui facilite l'écriture de SQL sale). Dans de nombreuses applications, il est judicieux de séparer les deux ces deux explicitement, encourageant le développeur à réfléchir aux attaques d'injection, etc. P>
dans la construction d'un moteur SQL, la première chose à essayer de faire, est de limiter La portée de ce que SQL votre moteur peut produire. Vous ne devez pas lui permettre de produire un avis qui limitant le SQL de ces manières ne limite pas ce que vous pouvez réellement sortir de la base de données. Oui, cela rend le codage à l'avant plus verbose à l'occasion, mais cela le rend également plus structuré et vous permet de jeter des centaines de lignes de code de bibliothèque qui n'étaient que jamais là-bas à la première place pour traiter des exceptions compliquées et fournir ( Ahem) "Flexibilité". P> Les bibliothèques que j'ai écrites jusqu'à présent sont d'environ 600 lignes de code (~ 170 lignes dont la manipulation erronée). Il traite des jointures ISO, des sous-états (dans le (autres que celles déjà mentionnées): le SQL est écrit expressément pour Oracle. Non testé sur toute autre plate-forme de base de données. P> Je suis prêt à partager le code, en supposant que toute amélioration soit renvoyée. P> Par exemple de ce que les bibliothèques me permettent de produire, je J'espère que ce qui suit est assez simple pour être intuitif, tout en étant assez complexe pour montrer le potentiel d'extensibilité: p> qui produit: p> avec la matrice de liaison: p> SELECT * à partir du tableau code> par exemple; Le moteur doit exiger que le développeur définisse chaque
Sélectionnez code>,
où code> et
ayant code> colonne explicitement. Comme un autre exemple, il est souvent utile de demander à chaque colonne d'avoir un alias (normalement pas requis par la base de données). P>
SELECT CODE>,
à partir de code> et
où code> clauses), toute clause de comparaison recto verso,
Dans code>,
existe code> et
entre code> (avec des sous-déclarations dans la clause WHERE). Il crée également implicitement implicitement des liaisons, au lieu d'injecter directement des valeurs dans les limitations SQL. P>
Vous pouvez envisager SQLBuilder, écrit en PHP et peut générer une plate-forme transversale SQL pour MySQL et PostgreSQL en définissant différents pilotes de requête. P>
Le cas d'utilisation est ici: https://github.com/c9s/sqlbuilder/blob /2.0/TESTS/SQLBuilder/Query/SelectQueryTest.php P>