首页 nodejs

node-sequelize基本使用

发布于: 2020-06-09

安装Sequelize

1
npm i sequelize

驱动安装(选择以下其一)

1
2
3
4
5
npm install --save pg pg-hstore # Postgres
npm install --save mysql2
npm install --save mariadb
npm install --save sqlite3
npm install --save tedious # Microsoft SQL Server

连接数据库测试连接初次体验

导入sequelize包

创建sequelize实例(通过实例构造方法传入参数创建连接数据库地址)

.authenticate()函数测试连接是否正常

1
2
3
4
5
6
7
8
9
10
11
12
const Sequelize = require('sequelize');
const sequelize = new Sequelize('dog', 'root', '123456', {
host: 'localhost',
/* 选择 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其一 */
dialect: 'mysql'
});
try {
sequelize.authenticate();
console.log("ok");
} catch (err) {
console.log(err)
}

构造函数参数详解

https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#instance-constructor-constructor

关闭连接

默认情况下,在保持连接打开的状态,并对所有的查询使用相同的连接

1
sequelize.close()

模型模型

模型的本质其实是代表的是数据库中表的抽象,包含数据库表的名称以及该名称下所具有的(以及列的数据类型)

模型定义-define方式

1
sequelize.define(modelName, attributes, options)

函数详解

https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#instance-method-define

https://sequelize.org/master/class/lib/model.js~Model.html#static-method-init

eg:定义一个user模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const {Sequelize,DataTypes} = require('sequelize');
const sequelize = new Sequelize('dog', 'root', '123456', {
host: 'localhost',
dialect: 'mysql'
});
const User = sequelize.define('User',{
firstname:{
type:DataTypes.STRING,
allowNull:false
},
lastname:{
type:DataTypes.STRING,
//allowNull 默认 true
}
},{
//其他模型参数
});
console.log(User === sequelize.models.User)

模型定义-init方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const {
Sequelize,
DataTypes,
Model
} = require('sequelize');
const sequelize = new Sequelize('sequelize', 'root', '123456', {
host: 'localhost',
/* 选择 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其一 */
dialect: 'mysql'
});

class User extends Model {}
User.init({
firstname: {
type: DataTypes.STRING,
allowNull: false,
},
lastname: {
type: DataTypes.STRING,
}
}, {
sequelize,
modelName: 'User'
});
console.log(User === sequelize.models.User)

sequelize.definemodel.init是等效的

字段属性设置

默认值

1
2
3
4
5
6
7
8
9
const User = sequelize.define('User', {
firstname: {
type: DataTypes.STRING,
defaultValue:"zhiqiang"
},
........
}, {
//其他模型参数
});

注释

1
2
3
4
5
6
7
8
9
10
const User = sequelize.define('User', {
firstname: {
type: DataTypes.STRING,
defaultValue:"zhiqiang",
comment:"注释"
},
}, {
//其他模型参数
});

Type可用的字段类型

数据库结构生成器包含构建表时可以指定的各种字段类型:

数据类型方法名称描述
字符串DataTypes.STRINGVARCHAR(255)
DataTypes.STRING(100)VARCHAR(100)
DataTypes.STRING.BINARYVARCHAR BINARY
DataTypes.TEXTTEXT
DataTypes.TEXT(‘tiny’)TINYTEXT
DataTypes.CITEXTCITEXT 仅 PostgreSQL 和 SQLite.
布尔DataTypes.BOOLEANTINYINT(1)
数字DataTypes.INTEGERINTEGER
DataTypes.BIGINTBIGINT
DataTypes.BIGINT(11)BIGINT(11)
DataTypes.FLOATFLOAT
DataTypes.FLOAT(11)FLOAT(11)
DataTypes.FLOAT(11, 10)FLOAT(11,10)
DataTypes.REALREAL 仅 PostgreSQL
DataTypes.REAL(11)REAL(11) 仅 PostgreSQL.
DataTypes.REAL(11, 12)REAL(11,12) 仅 PostgreSQL.
DataTypes.DOUBLEDOUBLE
DataTypes.DOUBLE(11)DOUBLE(11)
DataTypes.DOUBLE(11, 10)DOUBLE(11,10)
DataTypes.DECIMALDECIMAL
DataTypes.DECIMAL(10, 2)DECIMAL(10,2)
DataTypes.INTEGER.UNSIGNEDMySQL 和 MariaDB 设置为无符号或零填充
DataTypes.INTEGER.ZEROFILLMySQL 和 MariaDB设置为无符号或零填充
DataTypes.INTEGER.UNSIGNED.ZEROFILLMySQL 和 MariaDB设置为无符号或零填充
日期DataTypes.DATEDATETIME 适用于 mysql / sqlite,
DataTypes.DATE(6)DATETIME(6) 适用于 mysql 5.6.4+
DataTypes.DATEONLY不带时间的 DATE
UUIDDataTypes.UUID

对于 PostgreSQL 和 SQLite,它会是 UUID 数据类型,对于mysql会变成char(36),UUID默认值设置

1
2
3
4
{
type: DataTypes.UUID,
defaultValue: Sequelize.UUIDV4 // 或 Sequelize.UUIDV1
}

其他属性设置

表名复数

自定义表名

表名复数

在默认情况下,关联到数据库的表名为Users

增加配置 去掉复数的方式

方式一:全局配置,在实例化的时候增加freezeTableName配置

1
2
3
4
5
6
7
const sequelize = new Sequelize('sequelize', 'root', '123456', {
host: 'localhost',
dialect: 'mysql',
define: {
freezeTableName :true
}
});

方式二:单独模型配置

1
2
3
4
5
6
7
8
// define 方式定义模型
const User = sequelize.define('User', {
.........
}, {
//其他模型参数
//强制表名和模型名称保持一致
freezeTableNAme: true
});

自定义表名

1
2
3
4
5
6
7
const User = sequelize.define('User', {
.....
}, {
//其他模型参数
// 自定义表名
tableName:"zq_user"
});

时间戳createdAt/updatedAt

1
2
3
4
5
6
7
8
9
10
11
// define 方式定义模型
const User = sequelize.define('User', {
.....
}, {
// 去掉createdAt/updatedAt
// timestamps:false
// 去掉 createdAt
// createdAt:false,
// //去掉 updatedAt
// updatedAt:false,
});

模型同步表

1
2
3
4
5
6
7
8
9
// //用户模型同步到数据库中
// User.sync({force:true})

//生成的sql
CREATE TABLE IF NOT EXISTS `zq_user` (`id` INTEGER NOT NULL auto_increment , `firstname` VARCHAR(255) NOT NULL, `lastname` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;


// //一次性同步所有的
// sequelize.sync({force:true})

删除表

1
2
3
4
// 删除指定用户表
// User.drop();
// 删除所有的表
// sequelize.drop();