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 # Postgresnpm install --save mysql2npm install --save mariadbnpm install --save sqlite3npm 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驱动 mysql2const connect = {dialect: 'mysql',host,port,logging: true, // 操作数据库,cli显示原始 sql语句timezone: '+08:00', // 重要设置时区}// define 定义字段connect.define = {// timestamps: false, // 不会自动生成 createdAt updatedAt deleteAtparanoid: 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 --savenpx 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-usersnpx sequelize db:migratenpx 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类不能使用 构造函数 
constructornew 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
 
