nodejs ORM框架sequelize

| star比較多的ORM框架

ORM框架選型標準,支持原生SQL語句,支持鏈接池,支持事務javascript

name star
sequelize 19.9k
mongoose 19.4k
knex 10.5k
Bookshelf 5.7k
waterline 5.1k

以上數據截止2019.9.18java

sequelize

文檔齊全且支持中文,Star最多。文檔鏈接mysql

支持數據庫:postgresql、mysql、sqlite和sqlservergit

支持原生SQL 鏈接池 事務 遷移 CLIgithub

mongoose

mongoose只支持mongodbredis

knex

knex自己不是ORM框架,它的升級是bookshelf,bookshelf是ORMsql

支持數據庫:MSSQL, MySQL, PostgreSQL, SQLite3, Oraclemongodb

bookshelf

bookshelf是基於knex的ORM框架。數據庫

支持數據庫:mysql & mariadb、postgresql、sqlite3和Oracle數組

特性: 事務 鏈接池 流式查詢 promise和callback API 原生SQL語句

waterline

waterline是從Sails框架衍生出來的ORM框架。

支持數據庫:mysql、mongo、postgresql、redis等

可是文檔不太完善

| sequelize使用

一、鏈接數據庫

// 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'
  // 參數
});

DML操做

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");
});

使用原生sql操做數據庫

// 參數數組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對數據庫表和對象的關係支持的比較好,有利於項目的穩定性和維護。

相關文章
相關標籤/搜索