sequelize 增加数据库字段_Node项目使用Sequelize操作数据库(一)(包括模型,增,删、改等)...

这篇博客介绍了如何使用Sequelize这个Node.js ORM操作MySQL数据库,包括安装、数据库连接测试、模型定义、单表的增删改操作。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

显示如下,说明已成功

90b8bd008fdda2db2a6ae6d74f6cf870.png

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

每个索引对象可以设置的值

name:索引名称,默认模型名称+字段

fields: Array,索引字段

unique:唯一索引,默认false

创建模型实例对象

一个模型类对应一个表,一个模型实例对象就是一条对应的表记录,通过操作这个对象来关联操作对应的表中的数据,操作模型类就是操作表,操作模型类对象就是操作该表中的某条记录         模型类 - 表         模型实例 - 记录

举例:

新建数据库list,新建一个users表 数据结构如下:

cc2d8952c0e53466ad3a31302b4afc99.png

定义模型

(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. 单表的增删改

方式一:调用 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();

})()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值