欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.JS使用Sequelize操作MySQL的示例代碼

 更新時間:2017年10月09日 11:09:33   投稿:zx  
Node.JS提供了操作數(shù)據(jù)庫的基礎接口,本篇文章主要介紹了Node.JS使用Sequelize操作MySQL的示例代碼,具有一定的參考價值,有興趣的可以了解一下

Node.JS提供了操作數(shù)據(jù)庫的基礎接口,我們可以通過mysql模塊的query方法進行操作,但是需要編寫SQL語句,對于SQL語句并不精通的人來說有一定的難度,而且在代碼中保留SQL語句也有一定的危險性。為了方便進行數(shù)據(jù)庫操作,ORM框架應運而生,Sequelize正是這樣的模塊。

安裝Sequelize

首先,使用cd命令將終端控制臺定位到項目的根目錄,然后使用npm安裝:

npm install sequelize --save

安裝mysql2

由于sequelize依賴于mysql2所以也需要安裝mysql2:

npm install mysql2 --save

編寫配置

在項目根目錄新建個“configs”文件夾,在文件夾中新建一個名為“mysql-config.js”的文件,代碼如下:

var config = {
  dbname: 'testdb',
  uname: 'root',
  upwd: 'root',
  host: 'localhost',
  port: 3306,
  dialect: 'mysql',
  pool: {
    max: 5,
    min: 0,
    idle: 10000
  }
};

module.exports = config;

配置說明

  • dbname: 數(shù)據(jù)庫名稱
  • uname: 數(shù)據(jù)庫登錄名
  • upwd: 數(shù)據(jù)庫登錄密碼
  • host: 數(shù)據(jù)庫主機
  • port: 數(shù)據(jù)庫端口,mysql默認是3306
  • dialect: 數(shù)據(jù)庫類型,這里是mysql
  • pool: 連接池配置

【具體配置詳見MySQL相關的博客】

對sequelize進行簡單封裝

在項目根目錄新建“data”文件夾,在改文件夾中新建“db.js”文件。在db.js中添加以下代碼。

首先,創(chuàng)建sequelize實例:

// 引入模塊
const Sequelize = require('sequelize');
// 讀取配置
const mysqlConfig = require('../configs/mysql-config');

// 根據(jù)配置實例化seq
var seq = new Sequelize(mysqlConfig.dbname, mysqlConfig.uname, mysqlConfig.upwd, {
  host: mysqlConfig.host,
  dialect: mysqlConfig.dialect,
  pool: mysqlConfig.pool
});

定義一個defineModel函數(shù)用于定義數(shù)據(jù)模型:

/**
 * 定義數(shù)據(jù)模型
 * 
 * @param {any} name 模型名稱【數(shù)據(jù)庫表名】
 * @param {any} attributes 數(shù)據(jù)字段集合
 * @returns 數(shù)據(jù)模型對象
 */
function defineModel (name, attributes) {
  var attrs = {};

  for (let key in attributes) {
    let value = attributes[key];
    if (typeof value === 'object' && value['type']) {
      value.allowNull = value.allowNull || false;
      attrs[key] = value;
    } else {
      attrs[key] = {
        type: value,
        allowNull: false
      };
    }
  }

  // 附加公共字段
  // attrs.id = {
  //   type: ID_TYPE,
  //   primaryKey: true
  // };
  attrs.createAt = {
    type: Sequelize.BIGINT,
    allowNull: false
  };
  attrs.updateAt = {
    type: Sequelize.BIGINT,
    allowNull: false
  };
  attrs.version = {
    type: Sequelize.BIGINT,
    allowNull: false
  };
  // 狀態(tài):0表示有效,1表示無效,2表示已刪除,默認為0.
  attrs.status = {
    type: Sequelize.INTEGER,
    allowNull: false
  };
  
   // 調(diào)用seq的方法定義模型并返回
  return seq.define(name, attrs, {
    tableName: name,
    timestamps: false,
    hooks: {
      beforeValidate: function (obj) {
        let now = Date.now();
        if (obj.isNewRecord) {
          obj.createAt = now;
          obj.updateAt = now;
          obj.version = 0;
        } else {
          obj.updateAt = now;
          ++obj.version;
        }
      }
    }
  });
}

在這里我們可以對模型定義做一些修改,比如添加id、createAt、updateAt、version和status字段等。這樣,通過這個函數(shù)定義的模型都會帶這幾個字段,通常一個數(shù)據(jù)庫表都應該包含這些字段。

sequelize默認會為模型添加id字段,自增,主鍵。所以在這里可以不用關心該字段的定義。

在調(diào)用seq.define()方法的時候,設置了“timestamps”為false,當timestamps為true時,默認會為模型添加createAt和updateAt兩個字段,數(shù)據(jù)類型為Sequelize.DATE,這里我們自己定義為Sequelize.BIGINT用于存儲時間戳。

同時,設置tableName和模型的名稱一致,這樣符合我們的慣性思維。

最后,db.js模塊導出defineModel函數(shù):

exports.defineModel = defineModel;

定義模型

在data目錄下新建“model”文件夾,并在model文件夾中添加“Notices.js”。在Notices中,先引入需要的模塊:

var db = require('../db');
var seq = require('sequelize');

然后定義數(shù)據(jù)模型對象:

var Model = db.defineModel('Notices', {
  content: seq.TEXT,
  title: seq.STRING(30),
  startDate: seq.BIGINT,
  expireDate: seq.BIGINT,
  gmId: seq.INTEGER(10),
});

// 導出模型對象
module.exports = Model;

引入的db模塊就是前面對sequelize的封裝,然后通過defineModel()函數(shù)定義模型,添加公共字段。

在這里引入sequelize模塊主要是為了定義模型的時候指定數(shù)據(jù)類型。

同步數(shù)據(jù)結(jié)構(gòu)到數(shù)據(jù)庫

當模型定義后,需要在數(shù)據(jù)庫中建立對應的數(shù)據(jù)表,這時候需要做結(jié)構(gòu)的同步,可以使用以下方法進行同步:

Model.sync();

如果數(shù)據(jù)庫中已經(jīng)存在該模型對應的表,則不會進行同步操作,如果想要強制進行數(shù)據(jù)結(jié)構(gòu)的同步,可以通過force參數(shù)指定:

Model.sync({force: true});

使用模型

在Notices.js文件中可以直接使用Model對象進行操作,如果是外部文件,需要先引入Notices模塊

var Notices = require('../data/model/Notices');

添加數(shù)據(jù)

通過數(shù)據(jù)模型對象的create方法可以添加一條數(shù)據(jù),方法的返回值是一個Promise對象,所以可以直接調(diào)用Promise對象的then方法進行后續(xù)操作。

Notices.create({
  content: '我是公告內(nèi)容。',
  title: '系統(tǒng)公告的標題',
  gmId: '10086',
  status: 0,
  expireDate: 1527396599123,
  startDate: Date.now()
}).then((data) => {
  res.json({ code: 0, msg: '公告發(fā)布成功', result: data });
});

then方法的參數(shù)是一個function對象,該function對象有一個data參數(shù),這個data參數(shù)就是前面create方法操作的數(shù)據(jù)對象,可以從data里面獲得數(shù)據(jù)在數(shù)據(jù)庫中的id是什么。

通過await和async來實現(xiàn)同步編程效果

通過then的方式很像是嵌套function的回調(diào)式異步編程,有些有不喜歡嵌套function的人可以采用await來實現(xiàn)同步編程的效果,更多關于await的用法這里不討論。

(async () => {
  var data = await Notices.create({
    content: '我是公告內(nèi)容。',
    title: '系統(tǒng)公告的標題',
    gmId: '10086',
    status: 0,
    expireDate: 1527396599123,
    startDate: Date.now()
  });

  res.json({ code: 0, msg: '公告發(fā)布成功', result: data });
})();

await修飾的函數(shù)調(diào)用必須寫在async修改的函數(shù)里面,否則會報錯,所以這里在最外層包了一個即時函數(shù)。

關于即時函數(shù)的概念可以參考《JavaScript面向?qū)ο缶幊讨改稀愤@本書,里面說的挺詳細的。簡單說就是定義后立刻調(diào)用的一個函數(shù)。

修改數(shù)據(jù)

使用模型對象的update方法可以修改數(shù)據(jù):

Notices.update({
  status: 2
}, {
  where: {id: 100}
});

updata(values, opts)方法的第一個參數(shù)是要修改的數(shù)據(jù)集合,字段名稱和數(shù)據(jù)表對應。第二個參數(shù)是相關的一些操作參數(shù),where用于限制修改的數(shù)據(jù)的條件,和SQL語句的where作用一樣。

上面的效果是修改id為100的數(shù)據(jù)的status字段的值為2。

查詢數(shù)據(jù)

通過數(shù)據(jù)模型對象的find相關的方法可以實現(xiàn)查詢效果:

查詢所有數(shù)據(jù)

Notices.findAll();

改方法會返回Notices表中所有的數(shù)據(jù),返回值依然是一個Promise對象。

條件查詢

Notices.findAll({order: [['createAt', 'DESC']], limit: 10, where: {'status': 0}});
  • order字段用于指定排序規(guī)則,這里指定以createAt字段做降序排序。
  • limit字段用于指定查詢的數(shù)據(jù)量,這里表示返回前10條數(shù)據(jù)。
  • where字段用于指定條件查詢,這里表示查詢status為0的數(shù)據(jù)。

刪除數(shù)據(jù)

通過數(shù)據(jù)模型對象的destroy方法可以銷毀一條數(shù)據(jù),具體用法和查詢、修改等類似。

但是通常我們做刪除操作的時候并不是真的將數(shù)據(jù)從數(shù)據(jù)庫中抹除,而是通過數(shù)據(jù)的狀態(tài)字段去標識,方便后續(xù)維護。所以每個表通常都會定義一個status字段。

復雜的where條件

在sequelize中,還存在一個Op對象,用于處理復雜的條件操作。

[案例一]

var seq = require('sequelize');
var Op = seq.Op;

// 其它代碼... 

Model.update({
  status: 2,
  gmId: 10086
}, {
  where: {
    id: {
      [Op.in]: [1, 4, 2, 8, 13, 20]
    }
  }
}); 

上面這段代碼表示修改status的值為2,修改gmId的值為10086。修改的條件的,數(shù)據(jù)的id字段必須是在[1, 4, 2, 8, 13, 20]這個數(shù)組中的數(shù)據(jù)。

[案例二]

var date = Date.now();

Model.findAll({
  where: {
    status: 0, 
    sendDate: {[Op.lte]: date}, 
    expireDate: {[Op.gte]: date},
    [Op.or]: [
      {to: 1000017},
      {to: 0}
    ]
  }
});

上面這段代碼表示查詢所有sendDate小于等于當前時間,并且expireDate大于等于當前時間,且status的值為0,并且to字段的值為1000017或者為0。

參考文檔

以上也只是舉了一部分例子進行簡單說明而已,詳細的可以查考這份文檔,雖然是英文的,但是稍微花點時間應該多少是可以看懂的。

http://docs.sequelizejs.com/identifiers.html

【寫在文末:ORM方便了數(shù)據(jù)庫的操作,但是對于很多復雜的業(yè)務,它可能也并不能很好的解決,所以某些特定需求還是需要SQL來實現(xiàn)?!?/p>

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 使用webpack打包koa2 框架app

    使用webpack打包koa2 框架app

    本文給大家介紹的是使用webpack為koa2框架打包的步驟及最終的部署,非常實用,有需要的小伙伴可以參考下
    2018-02-02
  • 一步步教你利用Docker設置Node.js

    一步步教你利用Docker設置Node.js

    這篇文章主要介紹了利用Docker設置Node.js的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • Node.js使用express寫接口的具體代碼

    Node.js使用express寫接口的具體代碼

    這篇文章主要介紹了Node.js使用express寫接口,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • 手把手教你通過nodejs快速搭建一個服務器

    手把手教你通過nodejs快速搭建一個服務器

    這篇文章主要給大家介紹了關于如何通過nodejs快速搭建一個服務器的相關資料,在node.js中創(chuàng)建一個服務器非常簡單,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • node.js中使用Export和Import的方法

    node.js中使用Export和Import的方法

    這篇文章主要介紹了node.js中使用Export和Import的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • nodejs和C語言插入mysql數(shù)據(jù)庫亂碼問題的解決方法

    nodejs和C語言插入mysql數(shù)據(jù)庫亂碼問題的解決方法

    這篇文章主要介紹了nodejs和C語言插入mysql數(shù)據(jù)庫亂碼問題,需要的朋友可以參考下
    2017-04-04
  • 使用npm發(fā)布Node.JS程序包教程

    使用npm發(fā)布Node.JS程序包教程

    這篇文章主要介紹了使用npm發(fā)布Node.JS程序包教程,本文講解了配置package.json、注冊npm帳號、發(fā)布程序包等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • node 可讀流與可寫流的運用詳解

    node 可讀流與可寫流的運用詳解

    這篇文章主要為大家介紹了node 可讀流與可寫流的運用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • node.js安裝超詳細步驟教程(推薦!)

    node.js安裝超詳細步驟教程(推薦!)

    其實Node.js就是運行在服務端的JavaScript,Node.js是一個基于Chrome?JavaScript運行時建立的一個平臺,下面這篇文章主要給大家介紹了關于node.js安裝超詳細步驟教程的相關資料,需要的朋友可以參考下
    2023-06-06
  • Node.js Koa2使用JWT進行鑒權(quán)的方法示例

    Node.js Koa2使用JWT進行鑒權(quán)的方法示例

    這篇文章主要介紹了Node.js Koa2使用JWT進行鑒權(quán)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08

最新評論