三月份事情比较多,学得乱七八糟,差点被新单位入Java坑
前端不香吗? node.js不香吗
后台数据库还是入mysql的坑吧
Sequelize
Sequelize.js 提供对 MySQL,MariaDB,SQLite 和 PostgreSQL 数据库的简单访问,通过映射数据库条目到对象,或者对象到数据库条目。简而言之,就是 ORM(Object-Relational-Mapper)。Sequelize.js 完全是使用 JavaScript 编写,适用于 Node.js 的环境。
sequlize 中文官方文档:链接地址
本文已操作mysql为例
安装
npm install --save sequelize
npm install --save mysql2 // 安装驱动
建立连接
db.js
const Sequelize = require('sequelize')
const sequelize = new Sequelize(dbName, user, password, {
dialect: 'mysql',
host:"",
port:"",
logging: false, // 是否在控制台打印出原生sql语句
timezone: '+08:00', // 时区
pool: { // 池
max: 5,
min: 0,
acquire: 30000,
idle: 10000,
},
define: {
// create_time && update_time
timestamps: true, // 是否时间戳
createdAt: 'created_at',
updatedAt: 'updated_at',
deletedAt: 'deleted_at',
// 把驼峰命名转换为下划线
underscored: true,
scopes: {} // 作用域规则 可以包括与常规查找器 where, include, limit 等所有相同的属性
}
})
// 创建模型
sequelize.sync({force: false}) // 是否删除再重新创建
module.exports = {
sequelize
}
创建Model
const moment = require('moment'); // 格式化时间库
const {sequelize} = require('./db'); // 即是上文连接数据库后返回的模型实例
const {Sequelize, Model} = require('sequelize')
// 定义文章分裂模型
class CategoryModel extends Model {
// 可在此写一些实例方法或者静态方法
}
// 初始分类模型
CategoryModel.init({
id: {
type: Sequelize.INTEGER, // 类型
primaryKey: true, // 主键
autoIncrement: true // 自增长
},
name: {
type: Sequelize.STRING,
allowNull: false, // 允许为空
comment: '分类名称'
},
keyword: {
type: Sequelize.STRING,
allowNull: false,
comment: '分类关键字'
},
parent_id: {
type: Sequelize.INTEGER,
allowNull: true,
defaultValue: 0,
comment: '分类父级ID,默认为0'
},
created_at: {
type: Sequelize.DATE,
allowNull: false,
get() {
return moment(this.getDataValue('created_at')).format('YYYY-MM-DD');
}
}
}, {
sequelize,
modelName: 'category',
tableName: 'category'
})
module.exports = {
Category
}
增删改查
// 增
(async () => {
const now = Date.now()
const user = await CategoryModel.create({
name: '',
parent_id: 'root',
keyword: '',
})
console.log('创建:' + JSON.stringify(user))
})();
//查
(async () => {
// 查找所有
const allCate = await CategoryModel.findAll()
// 按id查找
const oneCate = await CategoryModel.findByPk(id)
// 按条件查询
const someCate = await CategoryModel.findAll({
where: {
// 模糊查询
name: {
$like: '小%',
},
// 精确查询
keyword: 'xxx',
}
})
// 分页查询
const size = 10 // 每页10条数据
const page = 1 // 页数
const pageUser = await CategoryModel.findAndCountAll({
where: {
name: {
$like: '%小',
},
},
limit: size,
offset: size * (page - 1),
})
})();
// 改
(async () => {
// 方法一
await CategoryModel.upsert(data) // data 里面如果带有 id 则更新,不带则新建
// 方法二
const cate= await CategoryModel.findByPk(id)
cate.update(data)
})()
// 删
(async () => {
// 方法一
// 删除所有名字带’小‘的用户
await CategoryModel.destroy({
where: {
name: 'xx',
},
})
// 方法二
const user = await UserModel.findByPk(id)
user.destroy()
})()
op
const { Op }= Sequelize
[Op.and]: {a: 5} // 且 (a = 5)
[Op.or]: [{a: 5}, {a: 6}] // (a = 5 或 a = 6)
[Op.gt]: 6, // id > 6
[Op.gte]: 6, // id >= 6
[Op.lt]: 10, // id < 10
[Op.lte]: 10, // id <= 10
[Op.ne]: 20, // id != 20
[Op.eq]: 3, // = 3
[Op.not]: true, // 不是 TRUE
[Op.between]: [6, 10], // 在 6 和 10 之间
[Op.notBetween]: [11, 15], // 不在 11 和 15 之间
[Op.in]: [1, 2], // 在 [1, 2] 之中
[Op.notIn]: [1, 2], // 不在 [1, 2] 之中
[Op.like]: '%hat', // 包含 '%hat'
[Op.notLike]: '%hat' // 不包含 '%hat'
[Op.iLike]: '%hat' // 包含 '%hat' (不区分大小写) (仅限 PG)
[Op.notILike]: '%hat' // 不包含 '%hat' (仅限 PG)
[Op.regexp]: '^[h|a|t]' // 匹配正则表达式/~ '^[h|a|t]' (仅限 MySQL/PG)
[Op.notRegexp]: '^[h|a|t]' // 不匹配正则表达式/!~ '^[h|a|t]' (仅限 MySQL/PG)
[Op.iRegexp]: '^[h|a|t]' // ~* '^[h|a|t]' (仅限 PG)
[Op.notIRegexp]: '^[h|a|t]' // !~* '^[h|a|t]' (仅限 PG)
[Op.like]: { [Op.any]: ['cat', 'hat']} // 包含任何数组['cat', 'hat'] - 同样适用于 iLike 和 notLike
[Op.overlap]: [1, 2] // && [1, 2] (PG数组重叠运算符)
[Op.contains]: [1, 2] // @> [1, 2] (PG数组包含运算符)
[Op.contained]: [1, 2] // <@ [1, 2] (PG数组包含于运算符)
[Op.any]: [2,3] // 任何数组[2, 3]::INTEGER (仅限PG)
[Op.col]: 'user.organization_id' // = 'user'.'organization_id', 使用数据库语言特定的列标识符, 本例使用 PG
常用内置变量
$and: {a: 5} // AND (a = 5)
$or: [{a: 5}, {a: 6}] // (a = 5 OR a = 6)
$gt: 6, // > 6
$gte: 6, // >= 6
$lt: 10, // < 10
$lte: 10, // <= 10
$ne: 20, // != 20
$not: true, // IS NOT TRUE
$between: [6, 10], // BETWEEN 6 AND 10
$notBetween: [11, 15], // NOT BETWEEN 11 AND 15
$in: [1, 2], // IN [1, 2]
$notIn: [1, 2], // NOT IN [1, 2]
$like: '%hat', // LIKE '%hat'
$notLike: '%hat' // NOT LIKE '%hat'
$iLike: '%hat' // ILIKE '%hat' (case insensitive) (PG only)
$notILike: '%hat' // NOT ILIKE '%hat' (PG only)
$like: { $any: ['cat', 'hat']}
// LIKE ANY ARRAY['cat', 'hat'] - also works for iLike and notLike
$overlap: [1, 2] // && [1, 2] (PG array overlap operator)
$contains: [1, 2] // @> [1, 2] (PG array contains operator)
$contained: [1, 2] // <@ [1, 2] (PG array contained by operator)
$any: [2,3] // ANY ARRAY[2, 3]::INTEGER (PG only)
$col: 'user.organization_id' // = "user"."organization_id", with dialect specific column identifiers, PG in this example