Sequlize详解(一)

3,957 阅读4分钟

众所周知,Node的出现赋予了前端开发人员更大的权利,更强的能力。Sequelize就是这个强大能力中的一部分,它是一个ORM,可以将数据库中的表单数据映射成js对象,让我们可以通过javascript来方便快捷的操作数据库。

建立连接

想要使用数据库,首先需要连接到这个数据库。

  1. Sequelize将在初始化时设置连接池,所以如果从单个进程连接到数据库,你最好每个数据库只创建一个实例。 如果要从多个进程连接到数据库,则必须为每个进程创建一个实例,但每个实例应具有“最大连接池大小除以实例数”的最大连接池大小。
const Sequlize = require('seqlize');

const sequelize = new Sequelize('database', 'username', 'password', {
    host: 'lcocalhost',
    dialect: 'mysql'|'sqlite'|'postgres'|'mssql',
    
    pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  },
  
   storage: 'path/to/database.sqlite',
})
  1. 构造函数参数:
  • database: 数据库名称。
  • username: 用于对数据库进行身份验证的用户名。
  • password: 用户密码。
  • host: 关系数据库的主机。
  • port: 主机的端口号。
  • dialect: 要连接的数据库类型。eg: mysql
  • dialectModulePath: 如果已指定,请从此路径加载方言库。例如,如果要在连接到pg数据库时使用pg.js而不是pg,则应在此处指定“pg.js”。
  • storage: 仅供sqlite使用(sqlite是一个轻量级的数据库)。默认为':memory:'.
  1. 测试连接:.authenticate()完成测试。
sequelize
  .authenticate()
  .then(() => {
    console.log('Success.');
  })
  .catch(err => {
    console.error('Failed', err);
  });

创建Module

  1. 概念:模型可以理解为数据库中的表。
  2. 定义:使用define()函数定义。具体实现方式请参照SequeLize.
  3. 在sequelize-typescript中,可以使用装饰器来快速简单的定义Module。
import {Table, Column, Model, HasMany} from 'sequelize-typescript';

@Table
class Person extends Model<Person> {

    @Column
    name: string;
    
    @Column
    birthday: Date;
    
    @HasMany(() => Hobby)
    hobbles: Hobby[];
    
}
  • Primary Key: 实现方式有两种--@Column({primaryKey: true}) || @PrimaryKey @Column(together).
  • timestamps: 时间戳。一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。使用数字签名技术产生的数据, 签名的对象包括了原始文件信息、 签名参数、 签名时间等信息。默认为false。
  • @CreatedAt, @UpdatedAt, @DeletedAt:
 @CreatedAt
  creationDate: Date;
 
  @UpdatedAt
  updatedOn: Date;
  
  @DeletedAt
  deletionDate: Date;
  • 添加方法:
import {Sequelize} from 'sequelize-typescript';
 
const sequelize =  new Sequelize({
        ...
        modelPaths: [__dirname + '/**/*.model.ts']
});
// or
sequelize.addModels([__dirname + '/**/*.model.ts']);

使用Module

  1. 数据查询:数据查询后返回的是模型实例.
  • find: 查找数据库中的一个特定元素。若是查找不到则返回null
import User from '../module/User';

public async fineUserById( id ) {
    const users = await User.find({
        where: { id: id}
    });
    console.log(users);  //user 即是查找到的符合条件的数据
}
  • findOne: 返回符合查找条件的第一条数据。
  • findOrCreate: 若是元素存在,则返回符合查询条件的元素。若是不存在,则依据查询条件来创建这样的元素。
  • findAll: 查找所有符合条件的数据。 以上是几种常用的查找数据的方法,具体所有查找的方法可以参考相关文档

原始SQL语句查询

使用sequelize中封装的方法可以完成数据查询,但是对于一些比较复杂的查询或者是习惯写SQL语句的开发人员来说,使用原始的SQL语句来查询更方便快捷。Sequelize中也支持传入SQL语句完成查询。

使用sequelize.query()函数完成查询,该函数支持传入两个参数。第一个参数是SQL语句的字符串,第二个参数传入一个option对象,进行一些查询的配置。具体参数配置,可查看官网

// 使用SQL语句完成联表查询
const data = await sequelize.query('SELECT * FROM Student WHERE id in(SELECT studentId FROM Class WHERE id = 1) LIMIT 6');

使用SQL语句直接进行查询,当语句中有变量的时候,需要注意安全性问题(SQL注入)。sequezlize也考虑到了这个问题,所以我们通过第二个参数传入一些变量来替换原始sql语句中的变量,避免SQL注入。

// id是变量
let id = 1;
const data = await sequelize.query(
    'SELECT * FROM Student WHERE id in(SELECT studentId FROM Class WHERE id = :id) LIMIT 6', {
    replacements: { id: id },
    type: sequelize.QueryTypes.SELECT
});

以上就是Sequelize的基础使用,在后续的文章中,我会为大家继续介绍Sequelized的其他内容。