最近用了nodejs + koa + sequelizejs 做了一个公司项目,今天来说说sequelizejs。
安装依赖
$ npm install --save sequelize
建立数据库连接
# db.ts 文件
const Sequelize = require('sequelize')
/**
* @param database 数据库名
* @param user 数据库用户名
* @param password 数据库连接密码
*/
const sequelize = new Sequelize(config.db.database, config.db.user, config.db.password, {
// 数据库host
host: config.db.host,
// 数据库端口
port: config.db.port,
// sequelize支持 mysql、sqlite、postgres、mssql, 选择自己的数据库语言
dialect: 'mysql',
pool: {
max: 90,
min: 0,
idle: 10000
},
dialectOptions: {
charset: 'utf8',
collate: 'utf8_general_ci',
}
})
测试连接
# db.ts 文件
sequelize.authenticate().then(() => {
console.log('Connection has been established successfully.');
}).catch((err: any) => {
console.error('Unable to connect to the database:', err);
})
定义一个User model
使用 sequelize.define('name', {attributes}, {options}) 来定义一个model, 每一个模型对应一个数据库表。
# models/User.ts文件
import { Sequelize, DataTypes } from 'sequelize'
module.exports = (sequelize: Sequelize, DataTypes: DataTypes) => {
const User = sequelize.define('user', {
// 自增长主键ID
id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true
},
firstName: {
type: DataTypes.STRING,
field: 'firstName'
},
lastName: {
type: DataTypes.STRING,
field: 'lastName'
},
age: {
type: DataTypes.INTEGER,
field: 'age'
}
}, {
// 是否需要增加createdAt、updatedAt、deletedAt字段
'timestamps': false,
// 如果为 true 则数据库表的名称和 model 相同,即 user
// 为 false MySQL创建的表名称会是复数 users
// 如果指定的表名称本就是复数形式则不变
freezeTableName: true,
// 设置字符编码, 支持中文字符
charset: 'utf8',
collate: 'utf8_unicode_ci',
// 设置索引
indexes: [
{
unique: true,
name: 'user_index', // 若不设置,则取fields字段以下划线连接组成,若字符太长,则需要摄者name
fields: ['id', 'fistName', 'lastName']
}
]
})
return User
}
将Model同步到数据库
#db.ts文件
const User = sequelize.import('./models/User')
module.exports = {
sequelize,
User
}
# app.ts
// alter: true 若model有改动,则同时变更数据库表格结构,原有的数据不变
// force: true 若force为true,则每个Model在尝试创建自己的表之前将运行DROP TABLE IF EXISTS
sequelize
.sync({alter: true})
.then(() => {
app.listen(8081)
console.log(`server running on port 8081`)
})
.catch((err: string) => {
console.error('Unable to connect to the database:', err);
})
简单查询
# service/user.ts
const db = require('../db')
// 使用sequelizejs语法查询
static getUserBySeqJs () {
return db.User.findAll({
// 设置raw: true,则返回一个原始对象,若为false,
raw: true,
// 查找年龄>=18的用户
where: {
age: {
[Op.gte]: 18
}
}
})
// 直接使用sql语句查询
static getUserBySql () {
return db.sequelize.query('select * from user where age >= 18 ', {
type: db.sequelize.QueryTypes.SELECT
})
}
}