DBX: intente deshacerse de compilar consultas MySQL

Hace mucho tiempo, cuando comenzaba a aprender PHP y las complejidades de compilar consultas MySQL (2011), tuve la idea de escribir un contenedor para MySQLi como Doctrine para simplificar la sintaxis de acceso a la base de datos. Ya es 2019 y decidí compartir mi bicicleta sobre el tema ORM.

Y así, este es DBX: el motor de base de datos MySQL para PHP basado en la biblioteca MySQLi basada en consultas de la descripción estructural de las tablas y campos de la base de datos en forma de matriz regular con la función de almacenamiento en caché de consultas estáticas y actualización automática del hash estático.

Al contrario del amor general por PDO, se eligió la funcionalidad ligera de MySQLi, que es más suave y fácil de programar y se ajusta de manera más concisa a la API DBX propuesta. Ni siquiera utilicé el compositor, porque no tengo ningún proyecto en el que utilizo dependencias de terceros que no sean autoescritas.

En realidad, considere un ejemplo de declaración de la estructura de una base de datos de prueba simple y sus tablas. Primero, conectaremos la biblioteca con la clase y enviaremos los datos de autorización con el host de la base de datos:

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

Ahora imagine que necesitamos describir y crear una tabla en la base de datos usando la sintaxis de una matriz PHP normal:

 <?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 sintaxis es simple aquí. No utilicé la escritura fuerte y simplemente elegí los valores TEXT, NUMBER y TYMESTAMP. Por supuesto, para una estructura más "direccional" de la tabla, se usa la ID de campo clave con incremento automático (no he visto casos en proyectos reales cuando se establece el incremento automático y la clave interfiere con el diseño de consultas y relaciones de tabla). Para indicar si el campo puede estar vacío, se especifica fill => true.

Los tipos de consulta de DataBaseX son muy simples y contienen métodos básicos como seleccionar, insertar, eliminar, actualizar, soltar, truncar, etc.

Por ejemplo, una consulta para crear una tabla:

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

O una consulta para agregar datos y una estructura de columnas podría verse así:

 // 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 estructura de la matriz permite que un día describa la base de datos y, posteriormente, solo manipule los campos de valor para modificar los datos que se utilizan para formar consultas.

Aquí hay una declaración de actualización de ejemplo, que eliminaré en el siguiente ejemplo:

 // 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); 

Me pareció que usar los campos criterio_campo y criterio_valor complica el sistema, así que creé una consulta que agrega automáticamente datos a la base de datos si aún no se ha creado o actualiza los datos existentes. Llamé a esta consulta CONSULTA DE INYECCIÓN y se llama por el prefijo "en":

 // 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); 

Esto funciona a un nivel bajo como este:

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

Todas las demás consultas son las más simples y no tiene sentido describirlas (ver ejemplos en el archivo de prueba index.php), pero no puedo evitar mostrar cómo funciona la consulta 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 />'; ?> 

Aquí, utilizando el prefijo "s", puede agrupar los parámetros de consulta s | field_id ( orden ) | asc ( dirección ) | 100 ( límite ) | 0 ( desplazamiento ) .

Entre otras cosas, DBX tiene una característica tan distintiva como un caché de archivos integrado basado en estadísticas JSON. Cada solicitud de cambio (INSERT, UPDATE, DELETE, TRUNCATE) hace que el hash se calcule en la tabla de hash de caché y actualiza automáticamente el caché estático, lo que le permite no pensar en la carga en las consultas SELECT.

En el futuro, planeo desarrollar el motor DBX y expandir las capacidades del diseñador de consultas SQL utilizando el sistema de configuración UNION y JOIN, así como agregar nueva compatibilidad con la base de datos de MySQL 8 basada en el tipo de estructura JSON.

Ahora DBX se usa en mi sistema de administración de contenido RevolveR y muestra buenas características (todo el sitio, siempre que haya una caché actualizada, se inicializa con una consulta a la base de datos y consume aproximadamente 0.7 Mb de RAM de intérprete). También es muy conveniente para mí ver toda la estructura de la base de datos en un archivo separado, lo que a veces acelera la acumulación y el diseño de nuevos módulos.

Repositorio del proyecto: DBX v1.1.1 en GitHub .

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


All Articles