# **sequelize**
## **安裝依賴**
```
npm install sequelize --save
```
## **創建文件夾**
```
sequelize
-> config.js
-> modules
-> user
-> User.js
-> BuiltInUser.js
...
-> services
User.js
```
## **sequelize/config.js**
```
// 引?sequelize庫
// Sequelize:類,DataTypes:數據類型,Op:運算符合輯
const { Sequelize } = require("sequelize"); // 引?sequelize
// 創建Sequelize實例
const sequelize = new Sequelize("mysqltest", "root", "123456", {
host: "localhost",
dialect: "mysql",
port: 3306,
logging: (sql) => {
console.log(sql); // 將 SQL 查詢?志打印到控制臺
},
dialectOptions: {
logQueryParameters: true, // 顯示實際參數值
},
timezone: "+08:00", // 設置為中國的時區(北京時間,UTC+8)
});
sequelize
.authenticate()
.then(() => {
console.log("sequelize數據庫連接成功!");
})
.catch((err) => {
console.error("數據庫連接失敗!", err);
});
// 導出實例
module.exports = sequelize;
```
## **sequelize/modules/user/User.js**
```
const { DataTypes } = require("sequelize");
const sequelize = require("../../config");
const BuiltInUser = require("./BuiltInUser");
const User = sequelize.define(
"users",
{
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
// 定義數據模型的字段
username: {
type: DataTypes.STRING, // 字段類型為字符串
allowNull: false, // 不允許為空
},
password: {
type: DataTypes.STRING, // 字段類型為字符串
allowNull: false, // 不允許為空
},
gender: {
type: DataTypes.ENUM,
values: ["0", "1", "2"], // 0: 男,1: 女,2: 保密
defaultValue: "2", // 默認為保密
allowNull: false, // 不允許為空
},
role: {
type: DataTypes.ENUM, // 字段類型為整數
values: ["1", "2"], // 1: 管理員,2: 普通用戶
defaultValue: "1", // 默認值為 1
allowNull: false, // 不允許為空
},
description: {
type: DataTypes.TEXT, // 字段類型為字符串
allowNull: true, // 不允許為空
},
avatar: {
type: DataTypes.STRING, // 字段類型為字符串
allowNull: true, // 不允許為空
},
},
{
sequelize,
// 告訴 sequelize 不需要自動將表名變成復數
freezeTableName: true,
modelName: "User",
timestamps: true, // 自動創建 createdAt 和 updatedAt 字段
createdAt: "createdAt",
updatedAt: "updatedAt",
paranoid: true, // 軟刪除,不物理刪除數據 設置為true數據庫會增加deletedAt
}
);
User.sync({ force: true }).then((res) => {
console.log("User 模型創建成功");
BuiltInUser(User);
});
module.exports = User;
```
## **sequelize/modules/user/BuiltInUser.js**
```
const USERS = [
{
username: "admin",
password: "123456",
gender: "1",
role: "1",
description: "this is a admin user",
avatar: null,
},
{
username: "test",
password: "Aa123456",
gender: "2",
role: "2",
description: "",
avatar: "",
},
];
const BuiltInUser = (User) => {
User.bulkCreate(USERS, { individualHooks: true }); // 創建基礎數據
};
module.exports = BuiltInUser;
```
## **sequelize/services/User.js**
```
const User = require("../modules/user/User");
const UserService = {
login: async ({ username, password }) => {
return await User.findAll({
where: {
username,
password,
},
});
},
getUserInfo: async (id) => {
return await User.findByPk(id);
},
updateUserInfo: async (id, data) => {
await User.update(data, {
where: {
id,
},
});
},
deleteUser: async (id) => {
// 模型如果配置了 paranoid: true
// 則 刪除的時候會添加刪除時間,即為軟刪除,而非真正的刪除
await User.destroy({
where: {
id,
},
});
},
};
module.exports = UserService;
// findAll 查詢所有匹配項
// findByPk 根據主鍵查詢
/*
const project = await Project.findByPk(123);
*/
// findOne 查詢單個匹配項
/*
const project = await Project.findOne({ where: { title: 'My Title' } });
*/
// findOrCreate 根據條件查找或創建
// findAndCountAll 查詢所有匹配項并返回總數
/*
const { count, rows } = await Project.findAndCountAll({
where: {
title: {
[Op.like]: 'foo%',
},
},
offset: 10,
limit: 2,
});
console.log(count);
console.log(rows);
*/
// create 創建新記錄
/*
const jane = await User.create({ name: 'Jane' });
// Jane exists in the database now!
console.log(jane instanceof User); // true
console.log(jane.name); // "Jane"
*/
// build 創建新記錄但不保存
```
## **contriller中使用**
```
eg1. login中查詢用戶
// 使用的是findAll,返回Array,讀取每一項的,dataValues, 登錄一般是第0條數據,只會返回0條或1條數據
let result = await UserService.login(req.body);
console.log(result);
eg2.根據id獲取用戶信息
// 使用的是findByPk,返回Object,讀取dataValues
let user1 = await UserService.getUserInfo("1");
console.log("user1: ", user1.dataValues);
eg3. 根據id修改用戶信息,此處修改的是用戶的簡介
// 使用的是update
UserService.updateUserInfo("1", { description: "123" });
eg4. 根據id刪除數據(用戶)
// 使用的是destroy
UserService.deleteUser("2");
```
## **其他方法**
```
findOne 查詢單個匹配項
const project = await Project.findOne({ where: { title: 'My Title' } });
findAndCountAll 查詢所有匹配項并返回總數,分頁查詢用到
const { count, rows } = await Project.findAndCountAll({
where: {
title: {
[Op.like]: 'foo%',
},
},
offset: 10,
limit: 2,
});
console.log(count);
console.log(rows);
create 創建新記錄
const jane = await User.create({ name: 'Jane' });
// Jane exists in the database now!
console.log(jane instanceof User); // true
console.log(jane.name); // "Jane"
```