关于sequelize:sequelize总结

什么是SequelizeSequelize 是一个基于promise的 Node.js ORM, 目前反对 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具备弱小的事务反对, 关联关系, 预读和提早加载,读取复制等性能。 简略说就是nodejs的ORM库,满足大部分SQL数据库。 装置npm i sequelize# 装置数据库驱动程序npm i pg pg-hstore # PostgreSQLnpm i mysql2 # MySQLnpm i sqlite3 # SQLitenpm i tedious # Microsoft SQL Servernpm i ibm_db # DB2连贯数据库const { Sequelize } = require("sequelize")// Option 1: Passing a connection URIconst sequelize = new Sequelize('mysql://root:123456@localhost:3306/test')// Option 2: Passing parameters separatelyconst sequelize = new Sequelize({ dialect: 'mysql', //指定连贯的数据库类型 host: 'localhost', username: 'root', password: '123456',})参数请参照API ...

June 28, 2022 · 2 min · jiezi

关于sequelize:sequelize统一设置表前缀

不废话,百度了半天没找到答案,也是看了源码才晓得的,源码以及行数地址:https://github.com/sequelize/... 配置参数写法: define: { // 前缀 schema: 'koa', // 连字符 schemaDelimiter: '_',}这样就能够了,如下图

November 12, 2020 · 1 min · jiezi

koa2sequelizemysqlpm2支持node-webpack打包线上部署日志查询

node+koa2+sequelize+mysql+pm2 (欢迎star) 简介koa2 作为主要node service 入口webpack 打包node 环境pm2 服务负载均衡mysql 数据库mysql 强大的事务 sequelizekoa-body,文件上传中间件koa-cors koa 跨域中间件log4 日志输出......项目独立提供服务接口,可作为前后端分类提供良好的解决方案 依赖node -v 8.4.0npm -v 5.3.0npm2 -v 3.5.1目录.├─auto //sequelize-auto 自动生成 models实体类└─src | main.js //入口文件 | router.js // controller 入口 | ├─config //配置文件 ├─controller //api层 ├─models // 实体类 └─utils //工具类 部署 git https://github.com/shanyanwt/koa_vue_blog.git npm install 开发环境 npm run dev localhost:8081 生产环境 npm run build //生成app.js npm run pm2 localhost:8081supervisor nodejs 热加载 开发环境使用supervisor -w src ,添加需要监听的文件,默认是全部但是有时不起作用,加上监听的文件即可 ...

September 10, 2019 · 2 min · jiezi

全栈开发入门实战后台管理系统

本文首发于 GitChat 平台,免费 Chat,链接:全栈开发入门实战:后台管理系统 感谢你打开了这篇 Chat,在阅读之前,需要让你了解一些事情。 第一,本 Chat 虽然免费,不代表没有价值,我会将个人全栈开发的经历叙述给你,希望对你有一些帮助;第二,文中所使用的技术栈并非最新,也并非最优。后台管理系统更多是 2B 端的产品,通常是业务优先。本 Chat 的目的是为了让你能够快速上手全栈开发。第三,本 Chat 虽然名为全栈开发,但是不会带你做完一个完整的后台管理系统项目。一是由于篇幅有限,二是由于时间关系,个人精力也有限。 正文本 Chat 的内容,正如 Chat 简介中所描述,将分为以下 5 大块: 开发准备前台样式数据库连接前后台交互线上部署你可能会发现,好像不知道要做什么,没错,后台管理系统一般都是企业内部定制开发,通常是对业务的数据管理,具体做什么功能由业务决定,但多数功能都是围绕着表格或者表单。 上面列举的仅仅是全栈开发的大致流程。首先,要做一些准备工作,例如:开发环境、编辑器环境以及依赖包配置等等工作;其次,我们要选定一个后台模版样式,快速套用,实现业务功能。(当然,你要自己开发也行,但不建议这么做,除非为了学习);然后,根据业务做数据库的设计,编写后台数据处理逻辑,以及前后台数据交互等功能;最后,测试并部署上线。 这里的示例,将实现一个学生数据的在线管理需求,其实就是一个在线表格,包括添加,删除功能,系统层面包括登录退出功能。麻雀虽小,五脏俱全,整体架子搭好了,再在上面添加功能就简单多了。好了,现在就开始全栈之旅吧。 开发准备启动项目首先要做的是,开发环境的安装,这里就不多说了,关于 Node 环境的安装,默认你已经搞定了。 既然采用 Express 作为 Web 框架,Express 也是要安装的,有了 Node 环境,安装 Express 就简单多了。我们直接上手 Express 的脚手架,全栈开发关键要速度。 npm install express-generator -g一定记得是全局安装。安装完成之后,输入 express -h 可以查看帮助。这里选用 ejs 模版引擎,为什么?因为我顺手而已,这个不重要。找个合适的目录,运行下面命令: express -e node-web-fullstack-demo生成项目目录之后,首先要安装依赖,如下命令: cd example-node-web-fullstacknpm install等待安装完成,我们就可以启动项目了,使用命令 npm start ,去浏览器中,打开网址:http://localhost:3000,看到写着 Express 的首页,代表你的项目启动成功了。 编辑器环境配置一个好的编码环境,可以让你项目开发效率加倍。 首先介绍一个编辑器配置 EditorConfig,这是一个编辑器的小工具。它有什么作用呢?简而言之,就是让你可以在不同的编辑器上,获得相同的编码风格,例如:空格缩进还是 Tab 缩进?缩进几个空格? 你可能觉得诧异,这个不是在编辑器上设置就可以了吗?没错,假设你从始至终都是在同一个电脑同一个编辑器上编码,那么可以忽略它。如果存在多电脑配合,亦或是多个编辑器配合,那么它就是神器。它几乎支持所有的主流编辑器,不用单独去编辑器中设置,配置文件就在项目中,用那个编辑器打开项目,都能获得一致的编码风格。 ...

May 30, 2019 · 5 min · jiezi

在Sequelize中使用迁移

Sequelize是Nodejs生态中一个比较出名的ORM框架。通过ORM框架,可以使用对象来操作数据库表数据,提高了开发效率和代码可读性,也方便后期维护。今天主要介绍通过迁移[Migration]来创建数据库,表。 迁移的好处,可以类比git。通过每次创建迁移文件,来支持更新,回滚数据库表结构,也方便协同开发,也避免人工手动去直接修改数据库,用代码自动管理。换个电脑,也不用去拷贝数据库,直接运行迁移就可以完全恢复开发环境,极大减轻了心智负担。 1. 创建项目, 安装node package依赖mkdir node_workcd node_workmkdir appnpm init -ynpm i sequelize-cli sequelize mysql2 koa2. 初始化Sequelizenpx sequelize init运行之后,会产生四个目录: config, migrations, models, seeders config: { "development": { "username": "root", "password": "root", "database": "app_development", "host": "127.0.0.1", "port": 8889, "dialect": "mysql", "timezone": "+08:00" }, "test": { "username": "root", "password": null, "database": "app_test", "host": "127.0.0.1", "dialect": "mysql" }, "production": { "username": "root", "password": null, "database": "app_production", "host": "127.0.0.1", "dialect": "mysql" }}环境env => {配置}不同环境,对应不同的配置,也可以自定义环境,比如home ...

May 10, 2019 · 4 min · jiezi

Sequelizejs-关联

One-To-One看似一对一,其实一对多.这里的 One-To-One 指的应该是查询数据(主表)结果中,关联信息是以单个形式作为一个属性挂在主表每一个对象中 实际上是,主表与关联表的多对一关系. belongsToSourceModel.belongsTo(TargetModel, { as, foreignKey, targetKey })拿 SourceModel 中的 foreignKey 和 TargetModel 中的 targetKey 进行关联.as 配置 TargetModel 的别名foreignKey 配置 SourceModel 中的外键字段名称,默认为 ${as || TargetModel.name}+${TargetModel.primaryKey}targetKey 配置 TargetModel 中的目标键字段名称,默认为 TargetModel 主键 查询出来结果结构如: const sourceObj = { <sourceObjAttr>: <value>, <sourceObjAttr>: <value>, ... <as || TargetModel.name>: targetObj}SourceModel 中存在 foreignKey 关联 TargetModel,比如: Player.belongsTo(Team)foreignKey 用来自定义 SourceModel 中的外键名称.比如: User.belongsTo(Company, { foreignKey: 'cid' }) // User.cid 即外键默认情况下,foreignKey 值为${Team.name}+${Team.primaryKey}.注意这里的连接是根据 source model 的配置而决定是 camelCase 还是 underscored.例如: ...

April 30, 2019 · 2 min · jiezi

Sequelize学习经验(ORM框架)

什么是ORM?简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全、可维护的SQL代码。直观上,是一种Model和SQL的映射关系。 sequelize.query(原始查询) 默认情况下,函数将返回两个参数 - 一个结果数组,以及一个包含元数据(受影响的行等)的对象。 请注意,由于这是一个原始查询,所以元数据(属性名称等)是具体的方言。 某些方言返回元数据 “within” 结果对象(作为数组上的属性)。 但是,将永远返回两个参数,但对于MSSQL和MySQL,它将是对同一对象的两个引用。 const result1 = await mysql.query(‘SELECT id, img_url, url from carousel where status = 1’); //返回值是两个相同元素组成的数组 “result1”: [ [ { “id”: 1, “url”: “/ClassDetail?id=4” }, { “id”: 4, “url”: “/ClassDetail?id=2” } ], [ { “id”: 1, “url”: “/ClassDetail?id=4” }, { “id”: 4, “url”: “/ClassDetail?id=2” } ] ]解决办法有两种传递一个查询类型来告诉后续如何格式化结果 const result= await mysql.query(‘SELECT id, img_url, url from carousel where status = 1’, { replacements: {}, type: mysql.QueryTypes.SELECT });传递模型const Carousel = require(’../../models/Carousel’);const result2 = await mysql.query(‘SELECT id, img_url, url from carousel where status = 1’,{ model: Carousel });替换查询中的替换可以通过两种不同的方式完成:使用命名参数(以:开头),或者由?表示的未命名参数。 替换在options对象中传递。?如果传递一个数组, ? 将按照它们在数组中出现的顺序被替换const banner2 = await mysql.query(‘SELECT id, img_url, url from carousel where id = ?’, { replacements: [1,4,5,6], type: mysql.QueryTypes.SELECT,});// 返回的结果只有数组第一个元素下标对应的数据:const banner3 = await mysql.query(‘SELECT id, img_url, url from carousel where id in (:[1,4,5,6])’, { replacements: {[1,4,5,6]}, type: mysql.QueryTypes.SELECT,});// 返回结果为符合数组的数据// 拓展:模糊查询sequelize.query(‘SELECT * FROM users WHERE name LIKE :search_name ‘, { replacements: { search_name: ‘ben%’ }, type: sequelize.QueryTypes.SELECT }).then(projects => { console.log(projects)})参考文档:Sequelize 中文文档 v4 - Raw queries - 原始查询 ...

April 11, 2019 · 1 min · jiezi

记一次 React + Koa + Mysql 构建个人博客

前言由于一直在用 vue 写业务,为了熟悉下 react 开发模式,所以选择了 react。数据库一开始用的是 mongodb,后来换成 mysql 了,一套下来感觉 mysql 也挺好上手的。react-router、koa、mysql 都是从0开始接触开发的,期间遇到过很多问题,印象最深的是 react-router 参考官方文档配置的,楞是跑不起来,花费了好几个小时,最后才发现看的文档是v1.0, 而项目中是v4.3, 好在可参考的资料比较多,问题都迎刃而解了。博客介绍前端项目通过 create-react-app 构建,server端通过 koa-generator 构建前后端分离,博客页、后台管理都在 blog-admin 里,对含有 /admin 的路由进行登录拦截前端: react + antd + react-router4 + axiosserver端: koa2 + mysql + sequelize部署:server端 运行在 3000 端口,前端 80 端口,nginx设置代理预览地址web端源码server端源码喜欢或对你有帮助,欢迎 star功能[x] 登录[x] 分页[x] 查询[x] 标签列表[x] 分类列表[x] 收藏列表[x] 文章列表[x] 发布文章时间轴[x] 文章访问次数统计[x] 回到顶部[x] 博客适配移动端[ ] 后台适配移动端[ ] 对文章访问次数进行可视化[ ] 留言评论[ ] 渲染优化、打包优化效果标签分类收藏文章编辑博客页响应式运行项目前端git clone https://github.com/gzwgq222/blog-admin.gitcd blog-adminnpm installlocalhost:2019server 端本地安装 mysql,新建 dev 数据库git clone https://github.com/gzwgq222/blog-server.gitcd blog-servernpm installserver 端前端 react + antd 开发,较为平缓,在此就不再叙述。主要记录下 koa + mysql 相关事宜全局安装 koa-generatornpm install -g koa-generato创建 node-server 项目koa node-server 安装依赖cd node-server npn install运行npm dev出现 Hello Koa 2! 表示运行成功先看routes文件index.jsconst router = require(‘koa-router’)()router.get(’/’, async (ctx, next) => { await ctx.render(‘index’, { title: ‘Hello Koa 2!’ })})router.get(’/string’, async (ctx, next) => { ctx.body = ‘koa2 string’})router.get(’/json’, async (ctx, next) => { ctx.body = { title: ‘koa2 json’ }})module.exports = routerusers.jsconst router = require(‘koa-router’)()router.prefix(’/users’)router.get(’/’, function (ctx, next) { ctx.body = ’this is a users response!’})router.get(’/bar’, function (ctx, next) { ctx.body = ’this is a users/bar response’})module.exports = router分别访问下列路由localhost:3000/stringlocalhost:3000/userslocalhost:3000/bar大概你已经猜到了,koa-router 定义路由访问时返回相应的内容,那我们只需要把相应的 data 返回去就行了,只是我们的数据得从数据库查询出来。本地安装 mysql项目安裝 mysqlnpm install mysql –save项目安裝 sequelizesequelize 是 ORM node框架,对SQL查询语句的封装,让我们可以用OOP的方式操作数据库npm install –save sequelize新建 sequelize.js,建立连接池const Sequelize = require(‘sequelize’);const sequelize = new Sequelize(‘dev’, ‘root’, ‘123456’, { host: ’localhost’, dialect: ‘mysql’, operatorsAliases: false, pool: { max: 5, min: 0, acquire: 30000, idle: 10000 }})sequelize .authenticate() .then(() => { console.log(‘MYSQL 连接成功……’); }) .catch(err => { console.error(‘链接失败:’, err); });// 根据模型自动创建表sequelize.sync()module.exports = sequelize创建 model、controllers 文件夹 定义model:定义表结构;controller:定义对数据库的查询方法以 tag.js 为例model => tag.jsconst sequelize = require(’../sequelize ‘)const Sequelize = require(‘sequelize’)const moment = require(‘moment’) // 日期处理库// 定义表结构const tag = sequelize.define(’tag’, { id: { type: Sequelize.INTEGER(11), // 设置字段类型 primaryKey: true, // 设置为主建 autoIncrement: true // 自增 }, name: { type: Sequelize.STRING, unique: { // 唯一 msg: ‘已添加’ } }, createdAt: { type: Sequelize.DATE, defaultValue: Sequelize.NOW, get() { // this.getDataValue 获取当前字段value return moment(this.getDataValue(‘createdAt’)).format(‘YYYY-MM-DD HH:mm’) } }, updatedAt: { type: Sequelize.DATE, defaultValue: Sequelize.NOW, get() { return moment(this.getDataValue(‘updatedAt’)).format(‘YYYY-MM-DD HH:mm’) } }},{ // sequelize会自动使用传入的模型名(define的第一个参数)的复数做为表名 设置true取消默认设置 freezeTableName: true})module.exports = tagcontroller => tag.s 定义了 create、findAll、findAndCountAll、destroy 方法const Tag = require(’../model/tag’)const Op = require(‘sequelize’).Opconst listAll = async (ctx) => { const data = await Tag.findAll() ctx.body = { code: 1000, data }}const list = async (ctx) => { const query = ctx.query const where = { name: { [Op.like]: %${query.name}% } } const {rows:data, count: total } = await Tag.findAndCountAll({ where, offset: (+query.pageNo - 1) * +query.pageSize, limit: +query.pageSize, order: [ [‘createdAt’, ‘DESC’] ] }) ctx.body = { data, total, code: 1000, desc: ‘success’ }}const create = async (ctx) => { const params = ctx.request.body if (!params.name) { ctx.body = { code: 1003, desc: ‘标签不能为空’ } return false } try { await Tag.create(params) ctx.body = { code: 1000, data: ‘创建成功’ } } catch(err) { const msg = err.errors[0] ctx.body = { code: 300, data: msg.value + msg.message } }}const destroy = async ctx => { await Tag.destroy({where: ctx.request.body}) ctx.body = { code: 1000, desc: ‘删除成功’ }}module.exports = { list, create, listAll, destroy在 routers 文件夹 index.js 中引入定义好的 tag controller ,定义路由const router = require(‘koa-router’)()const Tag = require(’../controllers/tag’)// tagrouter.get(’/tag/list’, Tag.list)router.get(’/tag/list/all’, Tag.listAll)router.post(’/tag/create’, Tag.create)router.post(’/tag/destroy’, Tag.destroy)module.exports = router/* 如每个 route 是单独的文件,可以使用 router.prefix 定义路由前缀router.prefix(’/tag’)router.get(’/list’, Tag.list)router.get(’/list/all’, Tag.listAll)router.post(’/create’, Tag.create)router.post(’/destroy’, Tag.destroy)*/因为 app 中 已经引入 routers 中的 index.js 调用了 app.use了,所以此处不需再引入在浏览器里输入 localhost:3000/tag/list 就可以看到返回的数据结构了,只不过 data 为空数组,因为我们还没添加进去任何数据到这里,model 定义表结构、sequelize操作数据库、koa-router 定义路由 这一套流程算是完成了,其他表结构,接口 都是一样定义的总结之前没有写过 node server 和 react,算是从零搭建该博客,踩了一些坑,也学到了很多东西,譬如react 开发模式、react-router、sequelize 操作mysql的crud、koa、nginx的配置等等。麻雀虽小,也是一次完整的前后端开发体验,脱离了浏览器的限制,像海贼王一样,打开了新世界的大门,寻找 onepiece ……web端源码server端源码详细的 server 端说明后续会在个人博客中添加关于此次部署文章Linksreactreact-router4antdreact-draft-wysiwygkoa2sequelize初尝 react + Node,错误之处还望斧正,欢迎提 issue ...

April 1, 2019 · 3 min · jiezi

Sequelize+mysql

网上找了很多资料,大多都是雷同的。我这里也是大同小异 ,只是想记录一下查阅资料的过程小白上路,高手勿怪……首先当然是要安装 mysql12 和 Sequelize执行npm i mysql12 –save 和 npm i Sequelize –save我还手动安装了一个全局的mysql~~下面来讲讲工具的使用navicat + XAMPP navicat 建立数据库第一步建立连接,如图:第二步创建数据库,在任意数据库右键,新建数据库,如图:第三步建表。创建数据库成功之后肯定要开始建表了对吧,must,如图:字段什么的就自己建去吧数据库设计?不好意思,我也不会设计,233333XAMPP 是干什么的呢,我也不是很清楚,反正我使用的这个版本的Navicat中XAMPP 是必须的存在简单的来说XAMPP只是给我的mysql提供了一个服务,使我能够访问到数据库我们访问数据库都是通过localhost 或者 自己的ip ,如果需要别人也能访问到我的ip相对的数据库需要设置一个广域,如图:emmmmmm……这里设置成0.0.0.0 就ok咯好了好了,我们要切入正题了sequelize 配置资源池let Sequelize = require(‘sequelize’);const database = require(’../database’);let _sequelize = new Sequelize(’tpzdz’, database.name, database.password, database.pool);module.exports = _sequelize;database 文件如图:pool中配置资源池max:最大连接数。根据数据库接收连接数相应配置。如果数据库接收最大连接数是100,那么这里必须小于100。min:最小连接数。最小指的是我在规定时间内给你保留这么多个链接,以便你再来的时候我可以给你直接匹配。这个点一直不好理解,举个栗子:饭店点餐员,就是链接数。客户来点餐,就是客户端请求数据。客户来了,需要配备一个点餐员,客户来了随时响应。但是到了关门的时间了,我就会让撤销所有的点餐员。acquire:等待链接时间。如果客户端请求服务器 30s内没有响应就会被拒绝掉,而不会一直请求着。如同打电话,超过时间之后就会提示你“对不起,您拨打的电话暂时无人接听”,而不是一直“嘟嘟”idle:资源池闲置时间。指的是如果在规定时间内没有客户端的请求服务器,那么超过时间我就会释放掉我的本次的资源池。建模sequelize提供根据数据库表建立modal,但是本次我使用的是自己手动建立let Sequelize = require(‘sequelize’);const database = require(’../database’);let db = new Sequelize(’tpzdz’, database.name, database.password, database.pool);let t_admin = db.define( ’t_admin’, { id: { filed: ‘id’, primaryKey: true, type: Sequelize.BIGINT, allowNull: false, autoIncrement: true }, name: { field: ’name’, type: Sequelize.STRING, allowNull: true }, auth: { field: ‘auth’, type: Sequelize.STRING, allowNull: true }, password: { field: ‘password’, type: Sequelize.STRING, allowNull: false }, chineseName: { field: ‘chineseName’, type: Sequelize.STRING, allowNull: true } }, { tableName: ’t_admin’, timestamps: false, freezeTableName: true });module.exports = t_admin;freezeTableName:默认false修改表名为复数,true不修改表名,与数据库表名同步timestamps:是否自动添加时间戳createAt,updateAt接下就是使用过程了………..。。。。。。。。预知后事如何,请听下回分解。。。。。。。。 ...

December 21, 2018 · 1 min · jiezi