众所周知,Node的出现赋予了前端开发人员更大的权利,更强的能力。Sequelize就是这个强大能力中的一部分,它是一个ORM,可以将数据库中的表单数据映射成js对象,让我们可以通过javascript来方便快捷的操作数据库。
建立连接
想要使用数据库,首先需要连接到这个数据库。
- 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',
})
- 构造函数参数:
- database: 数据库名称。
- username: 用于对数据库进行身份验证的用户名。
- password: 用户密码。
- host: 关系数据库的主机。
- port: 主机的端口号。
- dialect: 要连接的数据库类型。eg: mysql
- dialectModulePath: 如果已指定,请从此路径加载方言库。例如,如果要在连接到pg数据库时使用pg.js而不是pg,则应在此处指定“pg.js”。
- storage: 仅供sqlite使用(sqlite是一个轻量级的数据库)。默认为':memory:'.
- 测试连接:.authenticate()完成测试。
sequelize
.authenticate()
.then(() => {
console.log('Success.');
})
.catch(err => {
console.error('Failed', err);
});
创建Module
- 概念:模型可以理解为数据库中的表。
- 定义:使用define()函数定义。具体实现方式请参照SequeLize.
- 在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
- 数据查询:数据查询后返回的是模型实例.
- 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的其他内容。