Node項目使用Sequelize操作數據庫(一)(包括模型,增,刪、改等)

Sequelize 是一個基於 Promise 的 Node.js ORM,目前支持 Postgres、MySQL、SQLite 和 Microsoft SQL Server。它具有強大的事務支持,關聯關係、讀取和複製等功能。

所謂ORM是指對象關係映射,通過使用描述對象和數據庫之間映射的元數據,將面嚮對象語言程序中的對象自動持久化到關係數據庫中。本質上就是將數據從一種形式轉換到另外一種形式

以下以使用mysql數據庫作爲案例

爲了演示,首先新建文件夾初始化項目

$ mkdir sequelizeTest  // 新建文件夾

$ cd sequelizeTest  // 進入文件夾

$ npm init --yes // 初始化項目

1. 安裝

// Using NPM
$ npm install --save sequelize
// 使用哪種數據庫選擇不同的安裝
$ npm install --save mysql2
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server

我這裏安裝mysql2

2.數據庫連接測試

在項目文件夾下新建一個index.js

(async function() {
  const Sequelize = require('sequelize');
  // 第一個參數是數據庫名,第二個參數是數據庫用戶名,第三個參數密碼
  // 第四個參數配置參數 包括地址,數據庫類型等
  const sequelize = new Sequelize('list', 'root', '123456', {
    host: 'localhost',
    dialect: 'mysql'
  });
  // 測試是否連接函數
  sequelize.authenticate()
    .then(() => {
      console.log('連接成功');
      console.log("hello");
    })
    .catch(err => {
      console.log(err);
    })
})()

使用nodemon 作爲熱更新啓動,這樣就不用每次重啓了

$ npm install nodemon -g

啓動項目

$ nodemon index

顯示如下,說明已成功

3.定義模型

用來表述(描述)數據庫表字段信息的對象,每一個模型對象表示數據庫中的一個表,後續對數據庫的操作都是通過對應的模型對象來完成的

modelName:模型名稱,自定義         

attributes:模型中包含都數據,每一個數據映射對應表中都每一個字段         

options:模型(表)的設置

attributes:字段值描述:

  • type:字段類型,String|DataTypes
  • allowNull:是否允許爲空,默認爲true
  • defaultValue:默認值,默認爲null
  • unique:值唯一,默認爲false
  • primaryKey:是否爲主鍵,默認爲false

options:模型(表)的設置

  • timestamps:是否給每條記錄添加 createdAt 和 updatedAt 字段,並在添加新數據和更新數據的時候自動設置這兩個字段的值,默認爲true
  • paranoid:設置 deletedAt 字段,當刪除一條記錄的時候,並不是真的銷燬記錄,而是通過該字段來標示,即保留數據,進行假刪除,默認爲false
  • freezeTableName:禁用修改表名; 默認情況下,sequelize將自動將所有傳遞的模型名稱(define的第一個參數)轉換爲複數。 默認爲false             
  • tableName:手動設置表的實際名稱
  • 定義表索引    indexes:Array<Object>

         每個索引對象可以設置的值               

               name:索引名稱,默認模型名稱+字段                 

               fields: Array<string>,索引字段                 

              unique:唯一索引,默認false

創建模型實例對象         

一個模型類對應一個表,一個模型實例對象就是一條對應的表記錄,通過操作這個對象來關聯操作對應的表中的數據,操作模型類就是操作表,操作模型類對象就是操作該表中的某條記錄         模型類 - 表         模型實例 - 記錄

舉例: 

新建數據庫list,新建一個users表 數據結構如下:

 定義模型

(async function() {
  const Sequelize = require('sequelize');
  const sequelize = new Sequelize('list', 'root', '123456', {
    host: 'localhost',
    dialect: 'mysql'
  });
  const UsersModel = await sequelize.define('Users', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: Sequelize.INTEGER
    },
    username: {
      type: Sequelize.STRING(20),
      allowNull: false
    },
    password: {
      type: Sequelize.CHAR(32),
      allowNull: false
    },
    createdAt: {
      allowNull: false,
      type: Sequelize.DATE
    },
    updatedAt: {
      allowNull: false,
      type: Sequelize.DATE
    }
  }, {
    tableName: 'users'
  });
  // UsersModel
  // let user = UsersModel.build({
  //    username: "swnd",
  //    password: "q11111"
  // });
  // user = await user.save();
  // console.log(user.get({'id': 3}));
})()

對於數據類型請參考 Sequelize - DataTypes

4. 單表的增刪改

方式一:調用 build 方法後對象只存在於內存中,需要進一步調用 save 方法纔會保存到數據庫中。

let user = UsersModel.build({
   username: "swnd",
   password: "q11111"
});
user = await user.save();
console.log(user.get({'id': 3}));

以上代碼運行後,終端將會輸出以下信息:



方式二:調用 create 方法後,會直接保存到數據庫中。
const user = UsersModel.create({
  username: 'zhangsan',
  password: '123456'
})
console.log(user.get({'id': 6}));

方案一

const hasUser = await UsersModel.findOne({
  where: {
    id: 6,
    username: 'zhangsan'
  }
});
hasUser.username = 'wanggangdan'
hasUser.save();

方案二

const hasUser = await UsersModel.findOne({
  where: {
    id: 6
  }
});
const updatedUser = await hasUser.update({
  username: "green"
});
hasUser.save();

限制更新某字段

// 方案一
const hasUser = await UsersModel.findOne({
  where: {
    id: 6
  }
});
const updatedUser = await hasUser.update({
  username: "green2",
  password: '8888888888'
},{
   fields: ['username']  // 只允許更新這個
});

// 方案二
const hasUser = await UsersModel.findOne({
  where: {
    id: 6
  }
});
hasUser.username = 'wanggangdan'
hasUser.passwprd = '8989878888'
hasUser.save({ fields: ['username'] }); // 只允許更新這個

const hasUser = await UsersModel.findOne({
  where: {
    id: 3
  }
});
await hasUser.destroy();

如果我們啓用了 paranoid(偏執)模式,destroy 的時候不會執行 DELETE 語句,而是執行一個 UPDATE 語句將 deletedAt 字段設置爲當前時間(一開始此字段值爲NULL)。不過需要注意的是,僅當 timestamps=true 爲 true 時,paranoid 模式才能生效。

 

未完待續

本篇測試代碼

(async function() {
  const Sequelize = require('sequelize');
  const sequelize = new Sequelize('list', 'root', '123456', {
    host: 'localhost',
    dialect: 'mysql'
  });
  const UsersModel = await sequelize.define('Users', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: Sequelize.INTEGER
    },
    username: {
      type: Sequelize.STRING(20),
      allowNull: false
    },
    password: {
      type: Sequelize.CHAR(32),
      allowNull: false
    },
    createdAt: {
      allowNull: false,
      type: Sequelize.DATE
    },
    updatedAt: {
      allowNull: false,
      type: Sequelize.DATE
    }
  }, {
    tableName: 'users'
  });
  // 增 
  // 方式一
  // let user = UsersModel.build({
  //    username: "swnd",
  //    password: "q11111"
  // });
  // user = await user.save();
  // console.log(user.get({'id': 3}));
  // 方式二
  // const user = UsersModel.build({
  //   username: 'zhangsan2',
  //   password: '123456'
  // })
  // console.log(user.get({'id': 6}));
  // 改
  const hasUser = await UsersModel.findOne({
    where: {
      id: 3
    }
  });
  // hasUser.username = 'wanggangdan'
  // hasUser.passwprd = '8989878888'
  // hasUser.save({ fields: ['username'] }); // 只允許更新這個
  
  // const updatedUser = await hasUser.update({
  //   username: "green2",
  //   password: '8888888888'
  // },{
  //    fields: ['username']  // 只允許更新這個
  // });
  await hasUser.destroy();
})()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章