perpustakaan , dan mengapa anda harus mempertimbangkan menggunakannya dalam projek JavaScript seterusnya. Kami juga akan membantu anda menilai perpustakaan JavaScript dan TypeScript terbaik berdasarkan keperluan anda sebagai pemaju projek dan pekerja penyelenggaraan.
kita akan melihat setiap alat berikut:
Pemetaan Relasi Objek adalah teknik yang menukarkan hasil pertanyaan pangkalan data ke dalam contoh kelas entiti. Entiti hanya pembungkus objek untuk jadual pangkalan data. Ia mengandungi sifat yang dipetakan ke lajur jadual pangkalan data. Contoh entiti mempunyai kaedah untuk melaksanakan operasi CRUD dan menyokong ciri -ciri lain yang termasuk logik tersuai seperti pengesahan dan penyulitan data.
Jika anda membina projek kecil, anda tidak perlu memasang perpustakaan ORM. Sudah cukup untuk menggunakan penyataan SQL untuk memandu permohonan anda. ORM sangat bermanfaat untuk projek sederhana dan besar yang mendapat data dari beratus -ratus jadual pangkalan data. Dalam kes ini, anda memerlukan rangka kerja yang membolehkan anda mengendalikan dan mengekalkan lapisan data aplikasi anda dengan cara yang konsisten dan boleh diramal.
Kelas entiti adalah blok bangunan untuk aplikasi perniagaan, kerana ia direka untuk merangkum logik yang digunakan untuk melaksanakan peraturan perniagaan. Peraturan perniagaan ditakrifkan untuk memastikan bahawa proses automatik dilaksanakan hanya dalam skop dasar perniagaan. Contoh peraturan perniagaan termasuk:
diskaun pelanggan
-Ia kerja -kerja hubungan objek pemetaan untuk anda. Peraturan perniagaan biasanya memerlukan pelaksanaan batch pelbagai penyata SQL. Sekiranya pernyataan SQL tunggal gagal, ia boleh meninggalkan pangkalan data dalam keadaan yang tidak konsisten. Kebanyakan perpustakaan ORM menyokong ciri yang dipanggil Transaksi, yang menghalang peristiwa tersebut daripada berlaku. Sekiranya pernyataan SQL gagal dijalankan dalam konteks urus niaga ini, semua pernyataan SQL lain yang telah berjaya dilaksanakan dalam kumpulan itu tidak diterjemahkan oleh operasi yang disebut rollback.
Oleh itu, menggunakan perpustakaan ORM untuk membina lapisan data anda membantu memastikan pangkalan data sentiasa konsisten. Perpustakaan ORM biasanya mengandungi lebih banyak fungsi asas, seperti:Dalam artikel ini, saya akan memberikan coretan kod mengenai bagaimana setiap perpustakaan ORM melakukan perkara berikut:
Saya juga memasukkan maklumat penting seperti tarikh pelancaran, bilangan pengguna, dan pautan dokumen, serta saluran sokongan yang ada. Saya juga akan membincangkan isu -isu yang paling penting yang berkaitan dengan prestasi pertanyaan, penyelenggaraan perpustakaan, dan falsafah seni bina yang anda perlu berhati -hati apabila membuat keputusan anda.
Saya menyusun senarai dengan tarikh mula dari yang paling awal hingga yang terkini. Saya membahagikan senarai ke dalam dua bahagian mengikut bahasa yang disokong utama: JavaScript dan TypeScript.
Sebelum kita memulakan penilaian, mari kita lihat terlebih dahulu di Knex.js, pembina pertanyaan SQL yang popular yang telah diintegrasikan dengan banyak perpustakaan ORM yang disenaraikan di sini. Knex.js sangat fleksibel dan secara amnya melakukan lebih baik daripada beberapa perpustakaan ORM yang mempunyai pelaksanaan pembina pertanyaan mereka sendiri. Pertimbangkannya sebagai kelebihan apabila memilih perpustakaan Orm untuk menggunakan knex.js sebagai asasnya.
Jadi apa itu pembina pertanyaan?
Ia hanya API yang menyediakan satu set fungsi yang boleh dikaitkan bersama untuk membentuk pertanyaan. Berikut adalah contoh:
<code>knex({ a: 'table', b: 'table' }) .select({ aTitle: 'a.title', bTitle: 'b.title' }) .whereRaw('?? = ??', ['a.column_1', 'b.column_2']) SQL 输出: select `a`.`title` as `aTitle`, `b`.`title` as `bTitle` from `table` as `a`, `table` as `b` where `a`.`column_1` = `b`.`column_2` </code>
<code>$ npm install knex --save # 然后添加以下一个(添加 --save)标志: $ npm install pg $ npm install sqlite3 $ npm install mysql $ npm install mysql2 $ npm install oracledb $ npm install mssql </code>
<code>const knex = require('knex')({ client: 'mysql', connection: { host : '127.0.0.1', user : 'your_database_user', password : 'your_database_password', database : 'myapp_test' } }); knex.schema.createTable('users', function (table) { table.increments(); table.string('name'); table.timestamps(); }) 输出: create table `users` (`id` int unsigned not null auto_increment primary key, `name` varchar(255), `created_at` datetime, `updated_at` datetime) </code>
<code>knex('users').where({ first_name: 'Test', last_name: 'User' }).select('id') 输出: select `id` from `users` where `first_name` = 'Test' and `last_name` = 'User' </code>
<code>const subcolumn = knex.raw('select avg(salary) from employee where dept_no = e.dept_no') .wrap('(', ') avg_sal_dept'); knex.select('e.lastname', 'e.salary', subcolumn) .from('employee as e') .whereRaw('dept_no = e.dept_no') 输出: select `e`.`lastname`, `e`.`salary`, (select avg(salary) from employee where dept_no = e.dept_no) avg_sal_dept from `employee` as `e` where dept_no = e.dept_no </code>
<code>knex({ a: 'table', b: 'table' }) .select({ aTitle: 'a.title', bTitle: 'b.title' }) .whereRaw('?? = ??', ['a.column_1', 'b.column_2']) SQL 输出: select `a`.`title` as `aTitle`, `b`.`title` as `bTitle` from `table` as `a`, `table` as `b` where `a`.`column_1` = `b`.`column_2` </code>
Dalam contoh TypeScript di atas, knex.js hampir bertindak sebagai ORM. Walau bagaimanapun, tiada contoh objek entiti dibuat. Sebaliknya, gunakan definisi antara muka untuk membuat objek JavaScript dengan sifat jenis selamat.
Perhatikan bahawa banyak perpustakaan ORM yang disenaraikan dalam artikel ini Gunakan knex.js di latar belakang. Ini termasuk:
Perpustakaan Orm biasanya menyediakan ciri tambahan di atas knex.js. Mari kita lihat mereka di bahagian seterusnya.
Dalam kategori ini, semua perpustakaan yang disenaraikan di sini ditulis dalam JavaScript dan boleh dijalankan secara langsung di Node.js. Sokongan TypeScript disediakan melalui jenis terbina dalam atau @jenis/pakej definisi nod. Sekiranya anda mahukan sokongan terkemuka untuk projek TypeScript anda, anda harus melangkau ke bahagian Perpustakaan Orm Typescript.
Dalam lapisan akses data, dua corak seni bina popular digunakan:
Menggunakan corak pemetaan data, kelas entiti adalah murni dan mengandungi hanya sifat. Operasi CRUD dan peraturan perniagaan dilaksanakan dalam bekas yang dipanggil repositori. Berikut adalah contoh:
<code>$ npm install knex --save # 然后添加以下一个(添加 --save)标志: $ npm install pg $ npm install sqlite3 $ npm install mysql $ npm install mysql2 $ npm install oracledb $ npm install mssql </code>
Logik operasi CRUD dan peraturan perniagaan dilaksanakan dalam kelas entiti menggunakan mod rekod aktif. Berikut adalah contoh yang sama yang menggambarkan perkara di atas:
<code>const knex = require('knex')({ client: 'mysql', connection: { host : '127.0.0.1', user : 'your_database_user', password : 'your_database_password', database : 'myapp_test' } }); knex.schema.createTable('users', function (table) { table.increments(); table.string('name'); table.timestamps(); }) 输出: create table `users` (`id` int unsigned not null auto_increment primary key, `name` varchar(255), `created_at` datetime, `updated_at` datetime) </code>
menggunakan mod salah satu mempunyai kelebihan dan kekurangannya. Corak -corak ini dinamakan oleh Martin Fowler dalam corak seni bina aplikasi Enterprise 2003nya. Jika anda ingin mengetahui lebih lanjut mengenai topik ini, anda harus menyemak buku ini. Kebanyakan perpustakaan ORM yang disenaraikan dalam artikel ini menyokong satu atau kedua -dua mod.
mari kita mula memperhatikan mereka sekarang.
Sequelize adalah perpustakaan node.js orm yang sangat matang dan popular dengan dokumentasi yang sangat baik dengan contoh kod yang dijelaskan dengan baik. Ia menyokong banyak ciri lapisan data yang telah kami sebutkan di perpustakaan sebelumnya. Tidak seperti Bookshelf, ia mempunyai pembina pertanyaan sendiri yang melakukan dan juga knex.js.
Memasang perpustakaan sangat mudah, dan pemacu pangkalan data juga sangat langsung:
<code>knex('users').where({ first_name: 'Test', last_name: 'User' }).select('id') 输出: select `id` from `users` where `first_name` = 'Test' and `last_name` = 'User' </code>
Berikut adalah kod persediaan dan contoh penyata pertanyaan CRUD dan asas:
<code>const subcolumn = knex.raw('select avg(salary) from employee where dept_no = e.dept_no') .wrap('(', ') avg_sal_dept'); knex.select('e.lastname', 'e.salary', subcolumn) .from('employee as e') .whereRaw('dept_no = e.dept_no') 输出: select `e`.`lastname`, `e`.`salary`, (select avg(salary) from employee where dept_no = e.dept_no) avg_sal_dept from `employee` as `e` where dept_no = e.dept_no </code>
Berikut adalah contoh cara menulis pertanyaan yang kompleks:
<code>import { Knex, knex } from 'knex' interface User { id: number; age: number; name: string; active: boolean; departmentId: number; } const config: Knex.Config = { client: 'sqlite3', connection: { filename: './data.db', }, }; const knexInstance = knex(config); try { const users = await knex<user>('users').select('id', 'age'); } catch (err) { // 错误处理 } </user></code>
Dalam contoh pertanyaan kompleks terakhir, output SQL adalah:
<code>const repository = connection.getRepository(User);. const user = new User(); user.firstName = "Timber"; await repository.save(user); const allUsers = await repository.find(); </code>
Sequelize menyokong pernyataan SQL mentah, yang memberikan pemaju fleksibiliti untuk menulis kenyataan SQL yang kompleks dan berprestasi tinggi. Hasilnya juga boleh dipetakan ke contoh entiti objek. Berikut adalah contoh:
<code>const user = new User(); user.firstName = "Timber"; await user.save(); const allUsers = await User.find(); </code>
Kelemahan utama Sequelize adalah bahawa ia melambatkan pembangunan dan masalah menumpuk dan tidak diselesaikan. Nasib baik, satu penyelenggara mengumumkan bahawa perpustakaan akan mendapat perhatian yang sepatutnya bermula pada tahun 2021. Perhatikan bahawa semua projek Perpustakaan ORM dalam artikel ini adalah sumber terbuka dan mereka memerlukan bantuan pemaju untuk menjadikannya lebih baik.
Bahagian yang tinggal adalah serupa dengan teks input. Oleh kerana batasan ruang, tempat ini tidak akan diperluaskan. Sila ambil perhatian bahawa format imej tetap sama.
Atas ialah kandungan terperinci 9 Orms JavaScript dan TypeScript terbaik untuk 2024. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!