DBX: upaya untuk menyingkirkan kompilasi permintaan MySQL

Dahulu kala, ketika saya baru mulai belajar PHP dan seluk-beluk menyusun query MySQL (2011), saya mempunyai ide untuk menulis wrapper untuk MySQLi seperti Doctrine untuk menyederhanakan sintaks mengakses database. Ini sudah tahun 2019 dan memutuskan untuk membagikan sepeda saya pada tema ORM.

Jadi, ini adalah DBX - mesin basis data MySQL untuk PHP berdasarkan pustaka MySQLi berdasarkan permintaan deskripsi struktural dari tabel dan bidang basis data dalam bentuk array reguler dengan fungsi caching query statis dan pembaruan otomatis hash statis.

Berlawanan dengan kecintaan umum pada PDO, ia memilih fungsi MySQLi yang ringan, yang lebih lunak dan lebih mudah diprogram dan lebih cocok dengan ringkas ke dalam API DBX yang diusulkan. Saya bahkan tidak menggunakan komposer, karena saya tidak punya proyek di mana saya menggunakan dependensi pihak ketiga selain yang ditulis sendiri.

Sebenarnya, pertimbangkan contoh untuk mendeklarasikan struktur database pengujian sederhana dan tabelnya. Pertama, kami akan menghubungkan perpustakaan itu sendiri dengan kelas dan mengirim data otorisasi dengan host database:

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

Sekarang bayangkan kita perlu menggambarkan dan membuat tabel dalam database menggunakan sintaks dari array PHP biasa:

 <?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') ] ]; ?> 

Sintaksnya sederhana di sini. Saya tidak menggunakan pengetikan yang kuat dan hanya memilih nilai TEXT, NUMBER dan TYMESTAMP. Tentu saja, untuk struktur tabel yang lebih β€œpengarah”, ID bidang kunci dengan penambahan otomatis digunakan (Saya belum pernah melihat kasus dalam proyek nyata ketika mengatur kenaikan otomatis dan kunci mengganggu desain kueri dan hubungan tabel). Untuk menunjukkan apakah bidang dapat kosong, isikan => true ditentukan.

Tipe kueri DataBaseX sangat sederhana dan berisi metode dasar seperti memilih, menyisipkan, menghapus, memperbarui, menjatuhkan, memotong, dan sebagainya.

Misalnya, kueri untuk membuat tabel:

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

Atau kueri untuk menambahkan data dan struktur kolom mungkin terlihat seperti ini:

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

Struktur array memungkinkan suatu hari untuk menggambarkan database dan selanjutnya hanya memanipulasi bidang nilai untuk memodifikasi data yang digunakan untuk membentuk kueri.

Berikut adalah contoh pernyataan pembaruan, yang akan saya hilangkan dalam contoh berikut:

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

Bagi saya, menggunakan bidang criterion_field dan criterion_value memperumit sistem, jadi saya membuat kueri yang secara otomatis menambahkan data ke basis data jika belum dibuat atau memperbarui data yang ada. Saya menyebut kueri ini INJECT QUERY dan itu disebut dengan awalan "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); 

Ini berfungsi pada level rendah seperti ini:

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

Semua pertanyaan lain adalah yang paling sederhana dan tidak masuk akal untuk menggambarkannya (lihat contoh di file tes index.php), tapi saya tidak bisa membantu tetapi menunjukkan bagaimana query SELECT bekerja:

 <?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 />'; ?> 

Di sini, menggunakan awalan "s", Anda dapat mengelompokkan parameter kueri s | field_id ( order ) | asc ( direction ) | 100 ( batas ) | 0 ( offset ) .

Di antara hal-hal lain, DBX memiliki fitur khas sebagai cache file bawaan berdasarkan statika JSON. Setiap permintaan perubahan (INSERT, UPDATE, DELETE, TRUNCATE) menyebabkan hash dihitung dalam tabel hash cache dan secara otomatis memperbarui cache statis, yang memungkinkan Anda untuk tidak memikirkan beban pada permintaan SELECT.

Di masa depan, saya berencana untuk mengembangkan mesin DBX dan memperluas kemampuan perancang query SQL menggunakan sistem konfigurasi UNION dan JOIN, serta menambahkan dukungan database baru dari MySQL 8 berdasarkan pada tipe struktur JSON.

Sekarang DBX digunakan dalam sistem manajemen konten RevolveR saya dan menunjukkan karakteristik yang baik (seluruh situs, asalkan ada cache yang diperbarui, diinisialisasi dengan satu permintaan ke database dan mengkonsumsi sekitar 0,7 Mb RAM interpreter RAM). Juga sangat nyaman bagi saya untuk melihat seluruh struktur basis data dalam satu file terpisah, yang terkadang mempercepat penumpukan dan desain modul baru.

Repositori proyek: DBX v1.1.1 di GitHub .

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


All Articles