DBX: tenter de se dĂ©barrasser de la compilation des requĂȘtes MySQL

Il y a longtemps, alors que je commençais Ă  peine Ă  apprendre PHP et les subtilitĂ©s de la compilation de requĂȘtes MySQL (2011), j'ai eu l'idĂ©e d'Ă©crire un wrapper pour MySQLi comme Doctrine pour simplifier la syntaxe d'accĂšs Ă  la base de donnĂ©es. C'est dĂ©jĂ  2019 dĂ©jĂ  et j'ai dĂ©cidĂ© de partager mon vĂ©lo sur le thĂšme ORM.

Et donc, c'est DBX - le moteur de base de donnĂ©es MySQL pour PHP basĂ© sur la bibliothĂšque MySQLi basĂ© sur les requĂȘtes de la description structurelle des tables et des champs de la base de donnĂ©es sous la forme d'un tableau rĂ©gulier avec la fonction de mise en cache des requĂȘtes statiques et la mise Ă  jour automatique du hachage statique.

Contrairement Ă  l'amour gĂ©nĂ©ral du PDO, il a Ă©tĂ© choisi la fonctionnalitĂ© lĂ©gĂšre MySQLi, qui est plus douce et plus facile Ă  programmer et s'intĂšgre de maniĂšre plus concise dans l'API DBX proposĂ©e. Je n'ai mĂȘme pas utilisĂ© Composer, car je n'ai pas un seul projet oĂč j'utilise des dĂ©pendances tierces autres que l'auto-Ă©criture.

En fait, considĂ©rons un exemple de dĂ©claration de la structure d'une base de donnĂ©es de test simple et de ses tables. Tout d'abord, nous allons connecter la bibliothĂšque elle-mĂȘme Ă  la classe et envoyer les donnĂ©es d'autorisation Ă  l'hĂŽte de la base de donnĂ©es:

require_once './DBX.php'; $dbx_data = ['localhost', 'root', 'root', 'dbx_test', '8889']; 

Imaginez maintenant que nous devons décrire et créer une table dans la base de données en utilisant la syntaxe d'un tableau PHP standard:

 <?php /** * CREATE TABLE EXAMPLE */ $table_1 = 'example'; // table name $query_1 = 'c'; // create table sql $fields_1 = [ 'field_id' => [ 'type' => 'num', // int 'auto' => true, // auto increment 'length' => 255, 'fill' => true // not null ], 'field_text' => [ 'type' => 'text', // varchar 'length' => 255, 'fill' => true ], 'field_date' => [ 'type' => 'time', // TIMESTAMP 'value' => date('Ym-d') ] ]; ?> 

La syntaxe est simple ici. Je n'ai pas utilisĂ© de frappe forte et j'ai simplement choisi les valeurs TEXT, NUMBER et TYMESTAMP. Bien sĂ»r, pour une structure plus «directrice» de la table, l'ID de champ clĂ© avec incrĂ©mentation automatique est utilisĂ© (je n'ai pas vu de cas dans des projets rĂ©els lorsque la dĂ©finition de l'incrĂ©mentation automatique et de la clĂ© interfĂšre avec la conception des requĂȘtes et des relations de table). Pour indiquer si le champ peut ĂȘtre vide, fill => true est spĂ©cifiĂ©.

Les types de requĂȘte DataBaseX sont trĂšs simples et contiennent des mĂ©thodes de base telles que sĂ©lectionner, insĂ©rer, supprimer, mettre Ă  jour, supprimer, tronquer, etc.

Par exemple, une requĂȘte pour crĂ©er une table:

 // perform queries $dbx::query("c", $table_1, $fields_1); 

Ou une requĂȘte pour ajouter des donnĂ©es et une structure de colonnes pourrait ressembler Ă  ceci:

 // fields values for table_1 example $fields_2 = [ 'field_id' => [ 'value' => 456 ], 'field_text' => [ 'value' => 'I have to add into my table' ], 'field_date' => [ 'value' => date('Ym-d') ] ]; // perform queries $dbx::query('i', $table_1, $fields_2); 

La structure du tableau permet un jour de dĂ©crire la base de donnĂ©es et ensuite de manipuler uniquement les champs de valeur pour modifier les donnĂ©es qui sont utilisĂ©es pour former des requĂȘtes.

Voici un exemple de déclaration de mise à jour, que j'éliminerai dans l'exemple suivant:

 // fields values for table_1 example $fields_3 = [ 'field_id' => [ 'value' => 456 ], 'field_text' => [ 'new_value' => 'I was updated', 'criterion_field' => 'field_id', 'criterion_value' => 456 ], 'field_date' => [ 'value' => date('Ym-d') ] ]; // perform queries $dbx::query('u', $table_1, $fields_3); 

Il m'a semblĂ© que l'utilisation des champs crit_field et crit_value compliquait le systĂšme, j'ai donc créé une requĂȘte qui ajoute automatiquement des donnĂ©es Ă  la base de donnĂ©es si elle n'a pas encore Ă©tĂ© créée ou met Ă  jour les donnĂ©es existantes. J'ai appelĂ© cette requĂȘte INJECT QUERY et elle est appelĂ©e par le prĂ©fixe "in":

 // fields values for table_1 example $fields_2 = [ 'field_id' => [ 'value' => 0 ], 'field_text' => [ 'value' => 'Yo if field_id = 0 it\'s an insert or if id exists it\'s an update' ], 'field_date' => [ 'value' => date('Ym-d') ] ]; // perform queries $dbx::query('in', $table_1, $fields_2); 

Cela fonctionne Ă  un niveau bas comme celui-ci:

 INSERT INTO `revolver__comments` (`field_id`, `field_content`) VALUES ('5', 'TEST UPDATE') ON DUPLICATE KEY UPDATE `field_id`='5', `field_content`='TEST UPDATE'; 

Toutes les autres requĂȘtes sont les plus simples et cela n'a aucun sens de les dĂ©crire (voir les exemples dans le fichier de test index.php), mais je ne peux pas m'empĂȘcher de montrer comment fonctionne la requĂȘte SELECT:

 <?php // perform queries $dbx::query('s|field_id|asc|100|0', $table_1, $fields_1); ?> <?php // print structure print '<h2>DBX STRUCTURE</h2>'; print '<pre><code>'; print_r( $fields_1 ); print '</code></pre>'; // print result print '<h2>DBX QUERY RESULT</h2>'; print '<pre><code>'; print_r( $dbx::$result ); print '</code><pre><hr />'; ?> 

Ici, en utilisant le prĂ©fixe "s", vous pouvez regrouper les paramĂštres de requĂȘte s | field_id ( ordre ) | asc ( direction ) | 100 ( limite ) | 0 ( offset ) .

Entre autres choses, DBX possĂšde une caractĂ©ristique aussi distincte qu'un cache de fichiers intĂ©grĂ© basĂ© sur la statique JSON. Chaque demande de changement (INSERT, UPDATE, DELETE, TRUNCATE) provoque un calcul de hachage dans la table de hachage du cache et met automatiquement Ă  jour le cache statique, ce qui vous permet de ne pas penser Ă  la charge des requĂȘtes SELECT.

À l'avenir, je prĂ©vois de dĂ©velopper le moteur DBX et d'Ă©tendre les capacitĂ©s du concepteur de requĂȘtes SQL Ă  l'aide du systĂšme de configuration UNION et JOIN, ainsi que d'ajouter un nouveau support de base de donnĂ©es Ă  partir de MySQL 8 basĂ© sur le type de structure JSON.

Maintenant, DBX est utilisĂ© dans mon systĂšme de gestion de contenu RevolveR et prĂ©sente de bonnes caractĂ©ristiques (l'ensemble du site, Ă  condition qu'il y ait un cache mis Ă  jour, est initialisĂ© avec une requĂȘte dans la base de donnĂ©es et consomme environ 0,7 Mo de RAM d'interprĂšte). Il est Ă©galement trĂšs pratique pour moi de voir toute la structure de la base de donnĂ©es dans un fichier distinct, ce qui accĂ©lĂšre parfois la crĂ©ation et la conception de nouveaux modules.

Référentiel de projet: DBX v1.1.1 sur GitHub .

Source: https://habr.com/ru/post/fr438762/


All Articles