1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Node.JS使用Sequelize操作MySQL的示例代碼

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

      成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都做網(wǎng)站、成都網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的蘭山網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!

      安裝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é)構到數(shù)據(jù)庫

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

      Model.sync();

      如果數(shù)據(jù)庫中已經(jīng)存在該模型對應的表,則不會進行同步操作,如果想要強制進行數(shù)據(jù)結(jié)構的同步,可以通過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)。】

      以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


      本文題目:Node.JS使用Sequelize操作MySQL的示例代碼
      文章位置:http://www.ef60e0e.cn/article/pgodpi.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        建宁县| 西宁市| 深圳市| 和田市| 焉耆| 汪清县| 封开县| 滨州市| 阿巴嘎旗| 屏南县| 兴城市| 布拖县| 图们市| 丽江市| 同仁县| 昭苏县| 阿克陶县| 宜黄县| 通榆县| 丹棱县| 荣昌县| 云霄县| 时尚| 富锦市| 汶川县| 唐河县| 宜良县| 枣强县| 庄浪县| 日喀则市| 故城县| 南投县| 白玉县| 宣城市| 延吉市| 永昌县| 江油市| 嵊州市| 明水县| 岐山县| 郧西县|