Rumah > hujung hadapan web > tutorial js > 9 Orms JavaScript dan TypeScript terbaik untuk 2024

9 Orms JavaScript dan TypeScript terbaik untuk 2024

Joseph Gordon-Levitt
Lepaskan: 2025-02-09 12:55:08
asal
828 orang telah melayarinya

9 Best JavaScript and TypeScript ORMs for 2024

Artikel ini akan menerangkan secara ringkas apa itu pemetaan objek-relasi (ORM), apakah Orm

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:

    knex.js: SQL Query Builder
  • Sequelize
  • Bookshelf
  • Waterline
  • objection.js
  • Mongoose
  • typegoose
  • TypeOrM
  • Mikroorm
  • prisma
  • Peta Hubungan Objek

Pemetaan relasi objek mungkin kelihatan rumit, tetapi tujuannya adalah untuk menjadikan hidup anda lebih mudah sebagai pengaturcara. Untuk mendapatkan data dari pangkalan data, anda perlu menulis pertanyaan. Tetapi adakah ini bermakna anda perlu belajar SQL? Tidak, pemetaan objek-hubungan membolehkan anda menulis pertanyaan dalam bahasa pilihan anda.

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
  • Kelulusan pinjaman
  • Suruhanjaya Jualan
  • Pengiriman dan Pengiraan Cukai
  • Perpustakaan Orm

Pemetaan relasi objek biasanya dilakukan dengan bantuan perpustakaan. Istilah ORM yang paling sering merujuk kepada Perpustakaan ORM -Objektif Hubungan

Mapper

-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:

  • Pembina pertanyaan
  • Skrip Migrasi
  • alat CLI untuk menghasilkan kod boilerplate
  • Fungsi menanam untuk jadual pra-pengisian dengan data ujian

Dalam artikel ini, saya akan memberikan coretan kod mengenai bagaimana setiap perpustakaan ORM melakukan perkara berikut:

  • Tetapan dan Konfigurasi Awal
  • Operasi CRUD Asas
  • Operasi pertanyaan lanjutan

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.

knex.js: SQL Query Builder

  • Mula: Disember 2012
  • Laman web
  • GitHub: 158.6K Pengguna
  • Pangkalan data: Postgres, MSSQL, MySQL, MariaDB, SQLite3, Oracle, dan Amazon Redshift
knex.js kini merupakan pembina pertanyaan SQL JavaScript yang paling matang yang boleh dijalankan di Node.js dan dalam pelayar (melalui Webpack atau Browserify). Ia dapat menjana pertanyaan SQL berprestasi tinggi yang sama seperti pernyataan SQL yang ditulis secara manual.

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>
Salin selepas log masuk
Salin selepas log masuk
Ini menimbulkan persoalan, mengapa anda harus menggunakan pembina pertanyaan dan bukannya menulis pernyataan SQL asal? Saya akan memberi anda empat sebab:

    Ia membantu anda abstrak kod anda dari dialek SQL pangkalan data anda, menjadikannya lebih mudah untuk ditukar.
  • Ia menghapuskan atau mengurangkan kemungkinan serangan suntikan SQL ke atas permohonan anda.
  • Ia membolehkan pembinaan pertanyaan mudah dengan keadaan dinamik.
  • Ia mempunyai fungsi lain dan alat CLI untuk melaksanakan operasi pembangunan pangkalan data.
fungsi ini termasuk:

    Kolam Sambungan
  • antara muka panggilan balik dan janji
  • Interface Stream
  • Sokongan Transaksi
  • Sokongan mod
  • Migration
  • Sow Bents
Memasangnya dalam aplikasi anda memerlukan anda memasang pakej knex.js dan pemacu untuk pangkalan data yang anda gunakan:

<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>
Salin selepas log masuk
Salin selepas log masuk
ini adalah contoh kod persediaan:

<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>
Salin selepas log masuk
Salin selepas log masuk
Ini adalah contoh pertanyaan asas:

<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>
Salin selepas log masuk
Salin selepas log masuk
juga menyokong pernyataan SQL mentah. Berikut adalah contoh pertanyaan yang kompleks:

<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>
Salin selepas log masuk
Salin selepas log masuk
knex.js juga menyokong TypeScript, yang hebat kerana ia membolehkan anda menulis kod seperti ini:

<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>
Salin selepas log masuk
Salin selepas log masuk

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:

  • Bookshelf
  • objection.js
  • Mikroorm

Perpustakaan Orm biasanya menyediakan ciri tambahan di atas knex.js. Mari kita lihat mereka di bahagian seterusnya.

JavaScript Orm Library

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:

  • Data Mapper
  • Rekod Aktiviti

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>
Salin selepas log masuk
Salin selepas log masuk

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>
Salin selepas log masuk
Salin selepas log masuk

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

  • Mula: Julai 2010
  • Laman web
  • GitHub: Pengguna 726K
  • Slack
  • Pangkalan Data: Postgres, MySQL, MariaDB, SQLite, dan Microsoft SQL Server

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>
Salin selepas log masuk
Salin selepas log masuk

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>
Salin selepas log masuk
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan