数据库复习(sequelize复习)
以下文档摘要自sequelize中文文档
数据库连接
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: /* 选择 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其一 */
});
表创建连接 sequelize中没有表的概念,这里更多是说modal,故我们的项目一般分为modal、service、controller三层。
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');
const User = sequelize.define('User', {
// 在这里定义模型属性
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING
// allowNull 默认为 true
}
}, {
// 这是其他模型参数
});
【数据库复习(sequelize复习)】模型同步这里需要了解一下,通过
User.sync()
来做。数据库操作语句 这里需要提的是sequelize的所有操作都是基于modal实例上来进行的,实例通过
User.build
来进行创建,保存通过实例的save
方法进行。常用语句如下
- insert: User.create(创建对象)
- delete: User.drop(条件语句)
- update: User.update(修改对象,条件语句)
- select: User.findAll()
查询这里的语法和特殊点较多,语法有:
- findAll
- findOne
- findByPk
- findOrCreate
- findAndCountAll
- 表字段处理
- where
- order by
- limit、offset
- group by
User.findAll({
attributes: [
'foo',// 特定字段查询
['bar', 'baz'],// 将字段bar重命名为baz
[sequelize.fn('COUNT', sequelize.col('hats')), 'n_hats'] // 聚合count
]
})
where
const { Op } = require("sequelize");
Post.findAll({
where: {
[Op.and]: [{ a: 5 }, { b: 6 }],// (a = 5) AND (b = 6)
[Op.or]: [{ a: 5 }, { b: 6 }],// (a = 5) OR (b = 6)
someAttribute: {
// 基本
[Op.eq]: 3,// = 3
[Op.ne]: 20,// != 20
[Op.is]: null,// IS NULL
[Op.not]: true,// IS NOT TRUE
[Op.or]: [5, 6],// (someAttribute = 5) OR (someAttribute = 6)// 使用方言特定的列标识符 (以下示例中使用 PG):
[Op.col]: 'user.organization_id',// = "user"."organization_id"// 数字比较
[Op.gt]: 6,// > 6
[Op.gte]: 6,// >= 6
[Op.lt]: 10,// < 10
[Op.lte]: 10,// <= 10
[Op.between]: [6, 10],// BETWEEN 6 AND 10
[Op.notBetween]: [11, 15],// NOT BETWEEN 11 AND 15// 其它操作符[Op.all]: sequelize.literal('SELECT 1'), // > ALL (SELECT 1)[Op.in]: [1, 2],// IN [1, 2]
[Op.notIn]: [1, 2],// NOT IN [1, 2][Op.like]: '%hat',// LIKE '%hat'
[Op.notLike]: '%hat',// NOT LIKE '%hat'
[Op.startsWith]: 'hat',// LIKE 'hat%'
[Op.endsWith]: 'hat',// LIKE '%hat'
[Op.substring]: 'hat',// LIKE '%hat%'
[Op.iLike]: '%hat',// ILIKE '%hat' (不区分大小写) (仅 PG)
[Op.notILike]: '%hat',// NOT ILIKE '%hat'(仅 PG)
[Op.regexp]: '^[h|a|t]',// REGEXP/~ '^[h|a|t]' (仅 MySQL/PG)
[Op.notRegexp]: '^[h|a|t]',// NOT REGEXP/!~ '^[h|a|t]' (仅 MySQL/PG)
[Op.iRegexp]: '^[h|a|t]',// ~* '^[h|a|t]' (仅 PG)
[Op.notIRegexp]: '^[h|a|t]',// !~* '^[h|a|t]' (仅 PG)[Op.any]: [2, 3],// ANY ARRAY[2, 3]::INTEGER (仅 PG)// 在 Postgres 中, Op.like/Op.iLike/Op.notLike 可以结合 Op.any 使用:
[Op.like]: { [Op.any]: ['cat', 'hat'] }// LIKE ANY ARRAY['cat', 'hat']// 还有更多的仅限 postgres 的范围运算符,请参见下文
}
}
});
order by
Foo.findOne({
order: [
// 将返回 `name`
['name'],
// 将返回 `username` DESC
['username', 'DESC'],
// 将返回 max(`age`)
sequelize.fn('max', sequelize.col('age')),
// 将返回 max(`age`) DESC
[sequelize.fn('max', sequelize.col('age')), 'DESC'],
// 将返回 otherfunction(`col1`, 12, 'lalala') DESC
[sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],
// 将返回 otherfunction(awesomefunction(`col`)) DESC, 这种嵌套可能是无限的!
[sequelize.fn('otherfunction', sequelize.fn('awesomefunction', sequelize.col('col'))), 'DESC']
]
});
limit、offset
Project.findAll({ offset: 5, limit: 5 });
group by
Project.findAll({ group: 'name' });
连表查询 建立表关系语法:hasOne、hasMany、belongsTo、belongsToMany
建立后,可以通过get${指定键}获取,参考关联
延迟获取
const awesomeCaptain = await Captain.findOne({
where: {
name: "Jack Sparrow"
}
});
// 用获取到的 captain 做点什么
console.log('Name:', awesomeCaptain.name);
console.log('Skill Level:', awesomeCaptain.skillLevel);
// 现在我们需要有关他的 ship 的信息!
const hisShip = await awesomeCaptain.getShip();
// 用 ship 做点什么
console.log('Ship Name:', hisShip.name);
console.log('Amount of Sails:', hisShip.amountOfSails);
预先加载
const awesomeCaptain = await Captain.findOne({
where: {
name: "Jack Sparrow"
},
include: Ship
});
// 现在 ship 跟着一起来了
console.log('Name:', awesomeCaptain.name);
console.log('Skill Level:', awesomeCaptain.skillLevel);
console.log('Ship Name:', awesomeCaptain.ship.name);
console.log('Amount of Sails:', awesomeCaptain.ship.amountOfSails);
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 小学英语必考的10个知识点归纳,复习必备!
- 数据库设计与优化
- 数据库总结语句
- MySql数据库备份与恢复
- 数据库|SQL行转列方式优化查询性能实践
- MySQL数据库的基本操作
- springboot整合数据库连接池-->druid
- Android|Android sqlite3数据库入门系列
- Python3|Python3 MySQL 数据库连接