ORM框架選型標準,支持原生SQL語句,支持鏈接池,支持事務javascript
name | star |
---|---|
sequelize | 19.9k |
mongoose | 19.4k |
knex | 10.5k |
Bookshelf | 5.7k |
waterline | 5.1k |
以上數據截止2019.9.18java
文檔齊全且支持中文,Star最多。文檔鏈接mysql
支持數據庫:postgresql、mysql、sqlite和sqlservergit
支持原生SQL 鏈接池 事務 遷移 CLIgithub
mongoose只支持mongodbredis
knex自己不是ORM框架,它的升級是bookshelf,bookshelf是ORMsql
支持數據庫:MSSQL, MySQL, PostgreSQL, SQLite3, Oraclemongodb
bookshelf是基於knex的ORM框架。數據庫
支持數據庫:mysql & mariadb、postgresql、sqlite3和Oracle數組
特性: 事務 鏈接池 流式查詢 promise和callback API 原生SQL語句
waterline是從Sails框架衍生出來的ORM框架。
支持數據庫:mysql、mongo、postgresql、redis等
可是文檔不太完善
// var config = { // database: 'protocol', // username: 'root', // password: '123456', // host: 'localhost', // port: 3306 // }; var sequelize = new Sequelize(config.database, config.username, config.password, { host: config.host, port: config.port, dialect: 'mysql', logging: console.log, pool: { max: 5, min: 0, idle: 30000 }, timestamps: false //最好關掉timestamps , 框架自動幫你添加時間到UpdatedAt上邊 }); sequelize .authenticate() .then(() => { console.log('Connection has been established successfully.'); }) .catch(err => { console.error('Unable to connect to the database:', err); });
const Sequelize = require("Sequelize") //假設我要建一個test表,裏面含有firstName字段和lastName字段 const User = sequelize.define('user', { firstName: { type: Sequelize.STRING }, lastName: { type: Sequelize.STRING } }); //注意:此時建表成功後你查看數據庫時,會發現咱們剛建成功的表名叫tests,用sequelize建的表名實際上都會在你代碼裏表名後面加一個s,可是咱們平時用的時候不須要去加s
或者使用
const Model = Sequelize.Model; class User extends Model {} User.init({ // 屬性 firstName: { type: Sequelize.STRING, allowNull: false }, lastName: { type: Sequelize.STRING // allowNull 默認爲 true } }, { sequelize, modelName: 'user' // 參數 });
User.findAll({ attributes: ['foo', 'bar'] });
SELECT foo, bar ...
屬性能夠使用嵌套數組來重命名:
User.findAll({ attributes: ['foo', ['bar', 'baz']] });
SELECT foo, bar AS baz ...
// 查找全部用戶 User.findAll().then(users => { console.log("All users:", JSON.stringify(users, null, 4)); }); // 建立新用戶 User.create({ firstName: "Jane", lastName: "Doe" }).then(jane => { console.log("Jane's auto-generated ID:", jane.id); }); // 刪除全部名爲「Jane」的人 User.destroy({ where: { firstName: "Jane" } }).then(() => { console.log("Done"); }); // 將全部沒有姓氏的人改成「Doe」 User.update({ lastName: "Doe" }, { where: { lastName: null } }).then(() => { console.log("Done"); });
// 參數數組replacements 依次與sql語句的?對應 exports.getTableDataBySql = function (sql, replacements, cb) { sequelize // DbConn.QueryTypes.UPDATE、SELECT、INSERT、DELETE .query(sql, { replacements: replacements, type: DbConn.QueryTypes.SELECT }) .then(function (result) { cb(null, result) }) .catch(err => { cb(err) }); }
function f(callback) { var sql = "INSERT INTO table1(version, data) VALUES (?,?)" var sql2 = "INSERT INTO table2(name) VALUES (?)" var sql1 = "UPDATE table1 SET data = ? WHERE data = ?" sequelize.transaction(function (t){ // 要確保全部的查詢鏈都有return返回 return DbManager.addDataBySqlT(sql,t,["aaaa","bbbb"]).then(function (result) { return DbManager.addDataBySqlT(sql2,t,["ccc"]).then(function (err,ids) { return DbManager.updateDataBySqlT(sql1,t,["aaaa","bbbb"]).then(function (result) { //表示最終返回的結果 return ids[0] }); }) }) }).then(function (result) { // Transaction 會自動提交 // result 是事務回調中使用promise鏈中執行結果 callback(null,result) }).catch(function (err) { // Transaction 會自動回滾 // err 是事務回調中使用promise鏈中的異常結果 //callback(err,null) }); }
knex和sequelize算比較好用的,且文檔也比較易讀。knex上手容易,可是非ORM框架,比較適合快速開發的非商業項目。sequelize對數據庫表和對象的關係支持的比較好,有利於項目的穩定性和維護。