sequelize ORM V6版本 https://sequelize.org/master/
sequelize中文网 https://www.sequelize.com.cn/
github https://github.com/sequelize/sequelize
github中文 https://github.com/demopark/sequelize-docs-Zh-CN
https://www.sequelize.com.cn/
API https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#instance-constructor-constructor
https://sequelize.org/master/manual/getting-started.html
sequelize特点
- 基于 promise 的 Node.js ORM,
- 具有强大的事务支持, 关联关系,
- 预读和延迟加载,读取复制等
- 可以使用 ES6 语法
在默认情况下,id字段会被设置为主键,并且是AUTO_INCREMENT的,不需要我们自己声明
- 数据表,用JS中的模型代替,class或对象
- 建模,外键,同步到数据库
- 一条用 JS中的一个对象
- 多条记录用数组代替
- sql语句,用对象方法代替
- Sequelize 以ORM的方式操作MySQL
- Model constructor的bug
- toJSON序列化
Sequelize 操作 mysql 数据库
Sequelize常用数据类型和条件判断
Sequelize 常用增删改查函数
mysql8无法使用本机ip访问的解决方式
mysql
为所选数据库安装驱动程序,例如:mysql2驱动 代替了 mysql
npm install mysql2 sequelize -S
# 连接其他数据库
# 选择以下之一:
npm install --save pg pg-hstore # Postgres
npm install --save mysql2
npm install --save mariadb
npm install --save sqlite3
npm install --save tedious # Microsoft SQL Server
sequelize连接 mysql
/config/db.config.js
const dbConfig = {
database: 'koa-cms',
host: 'localhost',
port: '3306',
username: 'root',
password: 'root'
}
module.exports = dbConfig
config/sequelize.config.js
const {Sequelize} = require('sequelize')
const {
database, username, password, port, host,
} = require('@config/db.config')
// 指定数据库类型 要安装 MySQL驱动 mysql2
const connect = {
dialect: 'mysql',
host,
port,
logging: true, // 操作数据库,cli显示原始 sql语句
timezone: '+08:00', // 重要设置时区
}
// define 定义字段
connect.define = {
// timestamps: false, // 不会自动生成 createdAt updatedAt deleteAt
paranoid: true,
underscored: true, // 驼峰转下划线
createdAt: 'created_at',
updatedAt: 'updated_at',
deletedAt: 'deleted_at',
scopes: {
excludeTime: {
attributes: {
exclude: ['updated_at', 'deleted_at', 'created_at']
}
}
}
}
// 线上环境使用连接池
// connect.pool = {
// max: 5, // 连接池中最大的链接数量
// min: 0,
// idle: 10000 // 如果一个链接池 10s内没有被使用,就释放
// acquire: 30000,
// }
/**
* @description sequelize全局实例 Sequelize 4个参数
* @param { string } 数据库名
* @param { string } 数据库用户名
* @param { string } 数据库密码
* @param { object } connect连接数据库的配置项
*/
const sequelize = new Sequelize(database, username, password, connect)
module.exports = sequelize
models
const {
Model, Sequelize
} = require('sequelize')
const sequelize = require('@config/sequelize.config')
// 定义一个模型
class User extends Model {}
// init 创建数据库
User.init({
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
username: Sequelize.STRING,
openid: {
type: Sequelize.STRING(64),
unique: true
},
})
module.exports = new User()
模型同步
[model.sync(options)](https://sequelize.org/master/class/lib/model.js~Model.html#static-method-sync)
[sequelize.sync()](https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#instance-method-sync)
自动同步所有模型- https://sequelize.org/master/class/lib/model.js~Model.html#static-method-sync
- User.sync({ force: true }) 创建表,如果表已经存在,则将其首先删除
- 不要用,会直接删除数据库重新创建
- User.sync({ alter: true }) 检查数据库中表,修改字段和模型匹配
- 不要用,会破坏原理的表
await sequelize.sync({ force: true });
console.log("所有模型均已成功同步.");
// 仅当数据库名称以 '_test' 结尾时,它才会运行.sync()
sequelize.sync({ force: true, match: /_test$/ });
await User.drop();
console.log("用户表已删除!");
await sequelize.drop();
console.log("所有表已删除!");
表前缀
- schema 前缀
- schemaDelimiter 连字符
- https://github.com/sequelize/sequelize/blob/master/src/model.js#L1500
define: {
schema: 'koa',
schemaDelimiter: '_'
}
// koa_users
sequelize-cli
sequelize-cli工具来实现 migrations搬家
npm install sequelize sequelize-cli --save
npx sequelize-cli init # 生成配置文件
/models/index.js
.sequelize.rc
项目根目录新建 .sequelizerc
const path = require('path')
module.exports = {
// 指定配置文件路径
config: path.join(__dirname, 'database/config.json'),
// 存放表结构文件的路径
'migrations-path': path.join(__dirname, 'database/migrations'),
// 存放种子文件的路径
'seeders-path': path.join(__dirname, 'database/seeders'),
// 存放模型文件的路径 mongoose
'models-path': path.join(__dirname, 'database/models'),
}
npx sequelize
修改环境变量:set NODE_ENV=test
,连接不同的数据库
npx sequelize init:migrations # 生成目录
npx sequelize migration:generate --name=init-users
npx sequelize db:migrate
npx sequelize db:migrate:undo # 删除表
eggjs安装 mysql
安装msyql
npm i egg-mysql -S
启用插件:config/plugin.js 启用 mysql插件
exports.mysql = {
enable: true,
package: 'egg-mysql'
}
eggjs安装 sequelize
安装
npm install egg-sequelize mysql2 --save
启用插件:config/plugin.js 启用 sequelize插件
exports.sequelize = {
enable: true,
package: 'egg-sequelize'
}
ORM
ORM Object Relational Mapping 对象关系映射
- node操作 mysql:waterline,typeform,sequelize,typeORM
- nodejs中集成 sequelize
- 数据表,用js中的模型,【class或对象】代替
- 一条或多条记录,用js中的一个对象或数组代替
- sql语句,用对象的方法代替 sql语句
create.js
const { Blog, User } = require('./model')
// 异步调用数据库
;(async function() {
})()
sequelize 总结
避免for循环查询数据库
Op.in in查询避免循环查询数据库
group分组查询
Model中禁止使用构造函数 constructor
Sequelize的坑
- models 定义的 class类不能使用 构造函数
constructor
new class
会创建对象,导致写库时的 id是个对象,而不是数字报错
- scope 事务
链接 mysql
- 安装 mysql2驱动
node-application - ORM sequelize - 驱动 mysql2 - mysql
操作数据库,依赖模型 models/user
数据搬家 migration
返回数据的细节
this.dataValues 不受 get方法的影响,存储的是 原始的值
循环导入优化:
模块的导入,变成函数内部的局部导入
数据查询
循环查询数据库是危险的行为
查询不可控,把不可控的查询次数,变为可控的查询
in 查询 id 数组 [10, 20, 30]
group 分组
Sequelize.fn(‘SUM’, ‘score’) 求和,对 score
sequelize连接mysql报错
through socket ‘/tmp/mysql.sock’
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
- ln 设置MAMP的软连接
ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock
Error: connect ECONNREFUSED 127.0.0.1:3306
- mysql 这个连接库是可以使用
socketPath
这个属性指定Unix
套接字文件 - 用
dialectOptions
设置mysql
的属性
const connect = {
dialect: 'mysql',
host,
port,
logging: true, // 操作数据库,cli显示原始 sql语句
timezone: '+08:00', // 重要设置时区
dialectOptions: {
socketPath: '/tmp/mysql.sock' // 指定套接字文件路径
}
}
Sequelize术语
- Sequelize 是指库本身, sequelize 是指 Sequelize 的实例,表示与一个数据库的连接
- 连接到数据库,必须创建一个 Sequelize 实例
const sequelize = new Sequelize(database, username, password, connect)
- 在阅读 Sequelize 文档时在本地运行代码示例,帮助你更快地学习
- 基于 promise 的 Node.js ORM,所有方法现都使用 async/await. 公共 API 返回原生 promises
- inflection复数表名 https://www.npmjs.com/package/inflection