安装Sequelize
npm i sequelize
驱动安装(选择以下其一)
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()
函数测试连接是否正常
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)
}
构造函数参数详解
关闭连接
默认情况下,在保持连接打开的状态,并对所有的查询使用相同的连接
sequelize.close()
模型模型
模型的本质其实是代表的是数据库中表的抽象,包含数据库表的名称
以及该名称下所具有的列
(以及列的数据类型)
模型定义-define方式
sequelize.define(modelName, attributes, options)
函数详解
eg:定义一个user模型
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方式
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.define
和model.init
是等效的
字段属性设置
默认值
const User = sequelize.define('User', {
firstname: {
type: DataTypes.STRING,
defaultValue:"zhiqiang"
},
........
}, {
//其他模型参数
});
注释
const User = sequelize.define('User', {
firstname: {
type: DataTypes.STRING,
defaultValue:"zhiqiang",
comment:"注释"
},
}, {
//其他模型参数
});
Type可用的字段类型
数据库结构生成器包含构建表时可以指定的各种字段类型:
数据类型 | 方法名称 | 描述 |
---|---|---|
字符串 | DataTypes.STRING | VARCHAR(255) |
DataTypes.STRING(100) | VARCHAR(100) | |
DataTypes.STRING.BINARY | VARCHAR BINARY | |
DataTypes.TEXT | TEXT | |
DataTypes.TEXT('tiny') | TINYTEXT | |
DataTypes.CITEXT | CITEXT 仅 PostgreSQL 和 SQLite. | |
布尔 | DataTypes.BOOLEAN | TINYINT(1) |
数字 | DataTypes.INTEGER | INTEGER |
DataTypes.BIGINT | BIGINT | |
DataTypes.BIGINT(11) | BIGINT(11) | |
DataTypes.FLOAT | FLOAT | |
DataTypes.FLOAT(11) | FLOAT(11) | |
DataTypes.FLOAT(11, 10) | FLOAT(11,10) | |
DataTypes.REAL | REAL 仅 PostgreSQL | |
DataTypes.REAL(11) | REAL(11) 仅 PostgreSQL. | |
DataTypes.REAL(11, 12) | REAL(11,12) 仅 PostgreSQL. | |
DataTypes.DOUBLE | DOUBLE | |
DataTypes.DOUBLE(11) | DOUBLE(11) | |
DataTypes.DOUBLE(11, 10) | DOUBLE(11,10) | |
DataTypes.DECIMAL | DECIMAL | |
DataTypes.DECIMAL(10, 2) | DECIMAL(10,2) | |
DataTypes.INTEGER.UNSIGNED | MySQL 和 MariaDB 设置为无符号或零填充 | |
DataTypes.INTEGER.ZEROFILL | MySQL 和 MariaDB设置为无符号或零填充 | |
DataTypes.INTEGER.UNSIGNED.ZEROFILL | MySQL 和 MariaDB设置为无符号或零填充 | |
日期 | DataTypes.DATE | DATETIME 适用于 mysql / sqlite, |
DataTypes.DATE(6) | DATETIME(6) 适用于 mysql 5.6.4+ | |
DataTypes.DATEONLY | 不带时间的 DATE | |
UUID | DataTypes.UUID |
对于 PostgreSQL 和 SQLite,它会是 UUID
数据类型,对于mysql会变成char(36)
,UUID默认值设置
{
type: DataTypes.UUID,
defaultValue: Sequelize.UUIDV4 // 或 Sequelize.UUIDV1
}
其他属性设置
表名复数
自定义表名
表名复数
在默认情况下,关联到数据库的表名为Users
增加配置 去掉复数的方式
方式一:全局配置,在实例化的时候增加freezeTableName配置
const sequelize = new Sequelize('sequelize', 'root', '123456', {
host: 'localhost',
dialect: 'mysql',
define: {
freezeTableName :true
}
});
方式二:单独模型配置
// define 方式定义模型
const User = sequelize.define('User', {
.........
}, {
//其他模型参数
//强制表名和模型名称保持一致
freezeTableNAme: true
});
自定义表名
const User = sequelize.define('User', {
.....
}, {
//其他模型参数
// 自定义表名
tableName:"zq_user"
});
时间戳createdAt/updatedAt
// define 方式定义模型
const User = sequelize.define('User', {
.....
}, {
// 去掉createdAt/updatedAt
// timestamps:false
// 去掉 createdAt
// createdAt:false,
// //去掉 updatedAt
// updatedAt:false,
});
模型同步表
// //用户模型同步到数据库中
// 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})
删除表
// 删除指定用户表
// User.drop();
// 删除所有的表
// sequelize.drop();