数据库复习(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()
select
查询这里的语法和特殊点较多,语法有:
  • 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);

    推荐阅读