資料庫支援
- sequelize:
sequelize
支援多種關聯型資料庫,包括 MySQL、PostgreSQL、SQLite 和 MSSQL。它提供跨資料庫的相容性,讓開發者可以輕鬆切換資料庫類型而不需修改太多程式碼。 - objection:
objection
也建立在knex
之上,支援所有knex
支援的資料庫。它提供了對複雜查詢和關聯的良好支援,適合需要高效能的應用程式。 - bookshelf:
bookshelf
基於knex
,支援所有knex
支援的資料庫,包括 MySQL、PostgreSQL、SQLite 和 MSSQL。由於它依賴於knex
,因此資料庫支援範圍與knex
相同。 - waterline:
waterline
支援多種資料庫類型,包括關聯型資料庫(如 MySQL、PostgreSQL)和非關聯型資料庫(如 MongoDB)。它提供統一的介面來操作不同類型的資料庫,但對於某些資料庫的支援可能不如專門的 ORM 完善。
關聯處理
- sequelize:
sequelize
提供強大的關聯處理功能,支援一對一、一對多和多對多關聯。它允許在模型之間定義關聯,並提供方法來加載和操作關聯資料。 - objection:
objection
提供簡單而強大的關聯處理功能,支援一對一、一對多和多對多關聯。它的關聯 API 設計簡潔,易於使用,特別適合需要高效能的應用程式。 - bookshelf:
bookshelf
也支援複雜的關聯處理,允許定義一對一、一對多和多對多關聯。它提供了靈活的關聯 API,讓開發者可以輕鬆地操作關聯資料。 - waterline:
waterline
支援基本的關聯處理,但相對較為簡單。它支援一對一、一對多和多對多關聯,但在關聯處理的靈活性和功能性上不如其他 ORM。
查詢構建
- sequelize:
sequelize
提供強大的查詢構建功能,支援簡單查詢、複雜查詢和事務處理。它的查詢 API 直觀易用,支援鏈式調用。 - objection:
objection
也建立在knex
之上,提供高效能的查詢構建功能。它支援複雜查詢和自定義查詢,並提供簡單的 API 來處理查詢結果。 - bookshelf:
bookshelf
基於knex
,提供靈活的查詢構建功能。它允許使用knex
的所有查詢構建功能,並提供額外的模型方法來簡化查詢。 - waterline:
waterline
提供簡單的查詢 API,但相對較為基礎。它支援 CRUD 操作和基本的查詢,但在查詢構建的靈活性和功能性上不如其他 ORM。
擴展性
- sequelize:
sequelize
提供良好的擴展性,允許開發者自定義模型、關聯和查詢邏輯。它支援插件和中介軟體,讓開發者可以擴展其功能。 - objection:
objection
設計簡潔,提供良好的擴展性。它允許開發者自定義模型、關聯和查詢邏輯,並支援中介軟體。 - bookshelf:
bookshelf
具有高度的擴展性,特別是對於關聯和查詢邏輯。它允許開發者自定義模型方法、關聯和查詢構建邏輯。 - waterline:
waterline
也提供擴展性,但由於其設計較為抽象,可能在某些方面不如其他 ORM 直觀。
Ease of Use: Code Examples
- sequelize:
sequelize
的使用範例const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('database', 'username', 'password', { dialect: 'mysql' }); // 定義模型 const User = sequelize.define('User', { name: { type: DataTypes.STRING, allowNull: false }, age: { type: DataTypes.INTEGER, allowNull: false }, }); // 同步資料庫 sequelize.sync().then(() => { // 創建新使用者 return User.create({ name: 'Alice', age: 30 }); }).then(user => { console.log('使用者創建:', user.toJSON()); // 查詢使用者 return User.findAll(); }).then(users => { console.log('所有使用者:', users); }).catch(err => { console.error('錯誤:', err); });
- objection:
objection
的使用範例const { Model, knex } = require('objection'); const knexConfig = { client: 'mysql', connection: { host: 'localhost', user: 'root', password: '', database: 'test' } }; const db = knex(knexConfig); Model.knex(db); // 定義模型 class User extends Model { static get tableName() { return 'users'; } } // 創建新使用者 User.query().insert({ name: 'Charlie', age: 28 }).then(user => { console.log('使用者創建:', user); // 查詢所有使用者 return User.query(); }).then(users => { console.log('所有使用者:', users); }).catch(err => { console.error('錯誤:', err); });
- bookshelf:
bookshelf
的使用範例const knex = require('knex')({ client: 'mysql', connection: { host: 'localhost', user: 'root', password: '', database: 'test' }, }); const bookshelf = require('bookshelf')(knex); // 定義模型 const User = bookshelf.model('User', { tableName: 'users', }); // 創建新使用者 User.forge({ name: 'Bob', age: 25 }).save().then(user => { console.log('使用者創建:', user); // 查詢所有使用者 return User.fetchAll(); }).then(users => { console.log('所有使用者:', users); }).catch(err => { console.error('錯誤:', err); });
- waterline:
waterline
的使用範例const Waterline = require('waterline'); const waterline = new Waterline(); const adapter = require('sails-mysql'); const config = { adapters: { mysql: adapter }, connections: { myLocalMysql: { adapter: 'mysql', host: 'localhost', user: 'root', password: '', database: 'test' } } }; // 定義模型 const User = Waterline.Collection.extend({ identity: 'user', datastore: 'myLocalMysql', attributes: { name: { type: 'string' }, age: { type: 'number' } }, }); waterline.loadCollection(User); waterline.initialize({ adapters, connections }, (err, ontology) => { if (err) throw err; const User = ontology.collections.user; // 創建新使用者 User.create({ name: 'Dave', age: 22 }).then(user => { console.log('使用者創建:', user); // 查詢所有使用者 return User.find(); }).then(users => { console.log('所有使用者:', users); }).catch(err => { console.error('錯誤:', err); }); });