美文网首页
数据库复习(sequelize复习)

数据库复习(sequelize复习)

作者: 2林子易2 | 来源:发表于2021-03-07 15:27 被阅读0次

    以下文档摘要自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
      }
    }, {
      // 这是其他模型参数
    });
    

    模型同步这里需要了解一下,通过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);
    

    相关文章

      网友评论

          本文标题:数据库复习(sequelize复习)

          本文链接:https://www.haomeiwen.com/subject/pxddfltx.html