sequelize 增加数据库字段_Node项目使用Sequelize操作数据库(一)(包括模型,增,删、改等)...
Sequelize 是一個(gè)基于 Promise 的 Node.js ORM,目前支持 Postgres、MySQL、SQLite 和 Microsoft SQL Server。它具有強(qiáng)大的事務(wù)支持,關(guān)聯(lián)關(guān)系、讀取和復(fù)制等功能。
所謂ORM是指對(duì)象關(guān)系映射,通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將面向?qū)ο笳Z(yǔ)言程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中。本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式
以下以使用mysql數(shù)據(jù)庫(kù)作為案例
為了演示,首先新建文件夾初始化項(xiàng)目
$ mkdir sequelizeTest // 新建文件夾
$ cd sequelizeTest // 進(jìn)入文件夾
$ npm init --yes // 初始化項(xiàng)目
1. 安裝
// Using NPM
$ npm install --save sequelize
// 使用哪種數(shù)據(jù)庫(kù)選擇不同的安裝
$ 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.數(shù)據(jù)庫(kù)連接測(cè)試
在項(xiàng)目文件夾下新建一個(gè)index.js
(async function() {
const Sequelize = require('sequelize');
// 第一個(gè)參數(shù)是數(shù)據(jù)庫(kù)名,第二個(gè)參數(shù)是數(shù)據(jù)庫(kù)用戶名,第三個(gè)參數(shù)密碼
// 第四個(gè)參數(shù)配置參數(shù) 包括地址,數(shù)據(jù)庫(kù)類型等
const sequelize = new Sequelize('list', 'root', '123456', {
host: 'localhost',
dialect: 'mysql'
});
// 測(cè)試是否連接函數(shù)
sequelize.authenticate()
.then(() => {
console.log('連接成功');
console.log("hello");
})
.catch(err => {
console.log(err);
})
})()
使用nodemon 作為熱更新啟動(dòng),這樣就不用每次重啟了
$ npm install nodemon -g
啟動(dòng)項(xiàng)目
$ nodemon index
顯示如下,說(shuō)明已成功
3.定義模型
用來(lái)表述(描述)數(shù)據(jù)庫(kù)表字段信息的對(duì)象,每一個(gè)模型對(duì)象表示數(shù)據(jù)庫(kù)中的一個(gè)表,后續(xù)對(duì)數(shù)據(jù)庫(kù)的操作都是通過(guò)對(duì)應(yīng)的模型對(duì)象來(lái)完成的
modelName:模型名稱,自定義
attributes:模型中包含都數(shù)據(jù),每一個(gè)數(shù)據(jù)映射對(duì)應(yīng)表中都每一個(gè)字段
options:模型(表)的設(shè)置
attributes:字段值描述:
type:字段類型,String|DataTypes
allowNull:是否允許為空,默認(rèn)為true
defaultValue:默認(rèn)值,默認(rèn)為null
unique:值唯一,默認(rèn)為false
primaryKey:是否為主鍵,默認(rèn)為false
options:模型(表)的設(shè)置
timestamps:是否給每條記錄添加 createdAt 和 updatedAt 字段,并在添加新數(shù)據(jù)和更新數(shù)據(jù)的時(shí)候自動(dòng)設(shè)置這兩個(gè)字段的值,默認(rèn)為true
paranoid:設(shè)置 deletedAt 字段,當(dāng)刪除一條記錄的時(shí)候,并不是真的銷毀記錄,而是通過(guò)該字段來(lái)標(biāo)示,即保留數(shù)據(jù),進(jìn)行假刪除,默認(rèn)為false
freezeTableName:禁用修改表名; 默認(rèn)情況下,sequelize將自動(dòng)將所有傳遞的模型名稱(define的第一個(gè)參數(shù))轉(zhuǎn)換為復(fù)數(shù)。 默認(rèn)為false
tableName:手動(dòng)設(shè)置表的實(shí)際名稱
定義表索引? ? indexes:Array
每個(gè)索引對(duì)象可以設(shè)置的值
name:索引名稱,默認(rèn)模型名稱+字段
fields: Array,索引字段
unique:唯一索引,默認(rèn)false
創(chuàng)建模型實(shí)例對(duì)象
一個(gè)模型類對(duì)應(yīng)一個(gè)表,一個(gè)模型實(shí)例對(duì)象就是一條對(duì)應(yīng)的表記錄,通過(guò)操作這個(gè)對(duì)象來(lái)關(guān)聯(lián)操作對(duì)應(yīng)的表中的數(shù)據(jù),操作模型類就是操作表,操作模型類對(duì)象就是操作該表中的某條記錄 ?? ??? ?模型類 - 表 ?? ??? ?模型實(shí)例 - 記錄
舉例:
新建數(shù)據(jù)庫(kù)list,新建一個(gè)users表 數(shù)據(jù)結(jié)構(gòu)如下:
定義模型
(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}));
})()
4. 單表的增刪改
增
方式一:調(diào)用 build 方法后對(duì)象只存在于內(nèi)存中,需要進(jìn)一步調(diào)用 save 方法才會(huì)保存到數(shù)據(jù)庫(kù)中。
let user = UsersModel.build({
username: "swnd",
password: "q11111"
});
user = await user.save();
console.log(user.get({'id': 3}));
以上代碼運(yùn)行后,終端將會(huì)輸出以下信息:
方式二:調(diào)用 create 方法后,會(huì)直接保存到數(shù)據(jù)庫(kù)中。
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'] // 只允許更新這個(gè)
});
// 方案二
const hasUser = await UsersModel.findOne({
where: {
id: 6
}
});
hasUser.username = 'wanggangdan'
hasUser.passwprd = '8989878888'
hasUser.save({ fields: ['username'] }); // 只允許更新這個(gè)
刪
const hasUser = await UsersModel.findOne({
where: {
id: 3
}
});
await hasUser.destroy();
如果我們啟用了 paranoid(偏執(zhí))模式,destroy 的時(shí)候不會(huì)執(zhí)行 DELETE 語(yǔ)句,而是執(zhí)行一個(gè) UPDATE 語(yǔ)句將 deletedAt 字段設(shè)置為當(dāng)前時(shí)間(一開始此字段值為NULL)。不過(guò)需要注意的是,僅當(dāng) timestamps=true 為 true 時(shí),paranoid 模式才能生效。
未完待續(xù)
本篇測(cè)試代碼
(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'] }); // 只允許更新這個(gè)
// const updatedUser = await hasUser.update({
// username: "green2",
// password: '8888888888'
// },{
// fields: ['username'] // 只允許更新這個(gè)
// });
await hasUser.destroy();
})()
總結(jié)
以上是生活随笔為你收集整理的sequelize 增加数据库字段_Node项目使用Sequelize操作数据库(一)(包括模型,增,删、改等)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《命令与征服:变节者》FPS重置版震撼登
- 下一篇: DFC预测:2021年底Xbox One