Node--Sequlize搭建服务
来源:互联网 发布:成都中科大cms漏洞 编辑:程序博客网 时间:2024/05/22 16:05
参考资料:https://itbilu.com/nodejs/npm/VkYIaRPz-.html
准备环境:Mysql,Node
前沿:
为大家介绍一下,什么是sequlize,ssequlize是基于node的一个ORM框架,如果你有Java 或者是C#开发经验,我们在操作数据库的时候会用到一些ORM映射数据库的表实体到我们程序中的实体类,这里我们称之为关系对象。
这里说几种ORM框架,NET中我们有EF(微软)、NHibernate(开源),Java中我们有Hibernate,同样Node的出现,它也有自己的ORM,那就是sequlize,它的出现,大大简化了繁杂的sql语句操作数据库,使得我们编程更加高效,这里ORM的出现,其优点可不是为了让你少些SQL的,它会提供他自己的一套处理O-R-M 之间的关系,这样使得我们处理一些复杂数据的时候,非常容易。
对于老鸟来说:ORM上手起来是非常容易的,首先我们从它的基本增删该查讲起,其次我们掌握基本增删该查后,会学习表之间的关系如何创建,(每一个ORM都有他自己的一套指定表关系的模式),本人这里熟悉EF,了解NHibernate,刚刚掌握Sequlize,指定表关系也无非就是,A表B表C表之间的关系,一对多,多对多,一对一。
对于每一个ORM来说,掌握了这些,就可以开发使用了。
正式开始||
首先我们要创建一个本地文件夹
用Dos定为到这个文件夹,执行npm init 将其创建成为一个Node包
然后在这个包里安装sequlize,具体操作如下截图
然后在你刚创建的文件夹里创建一个index.js文件,我们今天所有的代码,都将在index.js里写,并且index.js也是我们的一个主入口文件。
基本增删改查(index.js文件操作)
1 //引入框架 2 3 const Sequelize = require('sequelize'); 4 //创建ORM实例 5 const sequelize = new Sequelize('api', 'root','', 6 { 7 'dialect': 'mysql', // 数据库使用mysql 8 } 9 );10 11 12 sequelize13 .authenticate()14 .then(()=>{15 console.log('链接成功');16 })17 .catch((error)=>{18 console.log('链接失败'+error);19 })
这里需要连接我们的MYSQL数据库
当我们连接好数据库后,需要创建模型,之后sequlize会自动将你创建的模型映射到数据库
下面我们就可以用User这个对象 来对数据库中的user表经行增删改查的操作了
我们真的完事大吉了吗?如果你这么认为,那就错了!.....我们需要把模型同步到数据库里
那么现在你得数据库就会自动创建好一张表
那么现在就可以真正经行增删该查的操作了
不过这里需要强调一点:
进入增删该查:
这里我需要彻头彻尾的粘贴一下代码,不然读者该骂了
1 //引入框架 2 const Sequelize = require('sequelize'); 3 //创建ORM实例 api是我的数据库名字 root登录数据库名 ‘’表示登录我的数据库不需要密码 4 const sequelize = new Sequelize('api', 'root','', 5 { 6 'dialect': 'mysql', // 数据库使用mysql 7 } 8 ); 9 10 sequelize11 .authenticate()12 .then(()=>{13 console.log('链接成功');14 })15 .catch((error)=>{16 console.log('链接失败'+error);17 })18 19 //模型的创建20 //1,用代码定义模型,然后同步到数据库中21 //2,通过已有数据库生成ORM model22 23 //自己看的知识点:数据验证,要求,age不能为负数! //这里我创建了三个模型对象 ,会在数据中生成三张表24 const User = sequelize.define('user',{25 name:Sequelize.STRING,//定义表结构 name 为string类型26 age:Sequelize.INTEGER,//定义表结构27 });28 29 const Message = sequelize.define('message',{30 text:Sequelize.STRING,//定义表结构31 });32 33 const Image = sequelize.define('image',{34 url:Sequelize.STRING,//定义表结构35 });
1 //同步所有的model和所有关系2 sequelize.sync();
下面在做修改,修改要加id,不加id会报错
下面我们在做查询操作
1 // 单条数据查询2 SELECT `id`, `first_name` AS `firstName`, `lastName`, `createdAt`, `updatedAt` FROM `user` AS `user` WHERE `user`.`id` = 13 4 // 多条数据查询5 SELECT `id`, `first_name` AS `firstName`, `lastName`, `createdAt`, `updatedAt` FROM `user` AS `user`
在这里再补充点查询 ,(如果我们想查询部分字段怎么半)
1 // User.findOne().then(u=>{ 2 // console.log('=========================='); 3 // console.log(u.dataValues); 4 // console.log('=========================='); 5 6 // }); 7 // //第二查询 8 User.findAll({ 9 where:{id:2},10 attributes:['lastName']//查询部分字段,即不必查询出来你表中所有的字段 类似于 select xx,cc from table11 })12 .then((users)=>{13 console.log('==========================');14 console.log(JSON.stringify(users));15 console.log('==========================');16 });17 // //第三查询18 // User.findOne({where:{id:2}})19 // .then((users)=>{20 // console.log('==========================');21 // console.log(JSON.stringify(users));22 // console.log('==========================');23 // });24 25 // //第四查询26 // User.findOne({where:{id:3}})27 // .then((u)=>{28 // console.log('==========================');29 // // console.log(u);30 // console.log('==========================');31 32 // });
最后我们说删除
当我们用sequlize.define(),定义表结构的时候,有时会遇到一些字段,你如说年龄字段,年龄不能为负数吧,比如说摸一个字段不能为空或者只能为字母或者输入长度不能超过50,这些问题都不是问题,我们在定义表结构的时候,可以设置一些属性,对其经行约束。
说白了,也就是他的内部机制有一个validate对象,可以设置它,从而达到限定某一个字段的属性,(如果你学过Asp.net MVC 这个功能和EF的特性标签很相似)
如上所示,列的定义可以是字符串、一个预定义的Sequelize构造函数、或是一个对象。在定义列时,我们可以指定数据类型,也可以指定默认值、主键/外键等约束,还可以自定义访问器(getter)和设置器(setter)。
1 //创建表 定义表结构 2 const User = sequelize.define('user', { 3 firstName: { 4 type: Sequelize.STRING, 5 validate:{ 6 is:["[a-z]",'i'],//只允许数字 7 }, 8 allowNull:false,//非空验证 9 defaultValue:'郭',//给该列设置默认值10 unique:false,//设置为true的时候,会为该列添加一个unique唯一约束11 primaryKey:false,//指定该列是不是主键12 field:firstName,//设置数据库中的字段名字,设置后sequlize会自动映射到数据库中,一般情况下默认即可,不用设置13 autoincrement:false,//是否为自增 14 references:{15 model:{16 //指定从表17 },18 key:id,//该列表示到外键列的引用19 },20 onDelete:'NO ACTION',//当被引用的外键更新时21 onUpdate:'NO ACTION',//当被引用的外键被删除时候22 },23 lastName: {24 type: Sequelize.STRING25 }26 },27 {28 omitNull:true,//是否忽略空值29 timestamps:true,//两个时间戳字段 createdAt updatedAt30 paranoid:true,//逻辑删除,当调用destroy的,不会删除,而是多出一列,叫做deletedAt,将其设置为true,从而表示删除真实项目中,我们没有真删除,都是逻辑删除31 freezeTableName:treu,//如果不将freezeTableName设置为true的话,那么数据库表明和模型实体类名不一致32 createdAt:false,33 updatedAt:false,//设置成false后,将不会在数据库表中生成默认列34 initialAutoIncrement:'id',35 hooks:{36 //钩子函数,主要是在某些事件发生的前或后,或者某些生命周期某些事件发生的前后调用触发37 afterDelete:()=>{38 console.log('==========================');39 console.log('删除完成后触发执行');40 console.log('==========================');41 42 },43 },44 validate:{45 //模型广泛验证对象,一般不用吧....46 }47 });
定义表结构时,设置的一些属性,大家可以做参考
1 名称 类型 说明 2 modelName String 模型名,在sequelize.models属性中会使用这个名称;如果没有在options中指定表名,数据库中也会使用此属性做为表名。 3 attributes Object 一个对象,其每个属性对应表中的一个列,每个列可以使用一个预定义的DataType、字符串或类型描述对象定义: 4 attributes.column String | DataType | Object 数据库中的列描述 5 attributes.column.type String | DataType DataType或字符串,表示列的数据类型 6 [attributes.column 7 .allowNull=true] Boolean 设置为false时,会给添加NOT NULL(非空)约束,数据保存时会进行非空验证 8 [attributes.column 9 .defaultValue=null] Any 字面默认值, JavaScript函数, 或一个 SQL 函数 (查看 sequelize.fn)10 [attributes.column11 .unique=false] String | Boolean 设置为true时,会为列添加唯一约束12 [attributes.column13 .primaryKey=false] Boolean 指定是否是主键14 [attributes.column15 .field=null] String 设置在数据库中的字段名。设置后会,Sequelize会将属性名映射到数据库中的不同名称16 [attributes.column17 .autoIncrement=false] Boolean 是否自增18 [attributes.column19 .comment=null] String 字段描述(自1.7+后,此描述不再添加到数据库中)20 [attributes.column21 .references=null] String | Model 引用对象22 [attributes.column23 .references.model] String | Model 如果列引用到另一个表,可以通过这个属性设置模型或字符串。24 [attributes.column25 .references.key='id'] String 该列表示到表外键列的引用26 [attributes.column.onUpdate] String 当被引用的键更新时的操作,可选值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一27 [attributes.column.onDelete] String 当被引用的键删除时的操作,可选值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一28 [attributes.column.get] Function 为列自定义一个访问器。使用this.getDataValue(String)时调用的值29 [attributes.column.set] Function 为列自定义一个设置器。使用this.setDataValue(String, Value)时调用的值30 [attributes.validate] Object 模型每次保存时调用的验证对象。可是validator.js中的验证函数(参见 DAOValidator)、或自定义的验证函数。31 [options] Object 提供给Sequelize 构造函数的一些默认值32 [options.defaultScope={}] Object 定义使用此模型的默认搜索范围。作用范围与提供给 find / findAll 的选项形式相同33 [options.scopes] Object 更多范围,定义 defaultScope 的定义形式相同。关于限制范围的定义请参考Model.scope34 [options.omitNull] Boolean 是否忽略空值,这意味着,所有列的空值将不会被保存35 [options.timestamps=true] Boolean 为模型添加 createdAt 和 updatedAt 两个时间戳字段36 [options.paranoid=false] Boolean 使用逻辑删除。设置为true后,调用 destroy 方法时将不会删队模型,而是设置一个 deletedAt 列。此设置需要 timestamps=true37 [options.underscored=false] Boolean 转换列名的驼峰命名规则为下划线命令规则38 [options.underscoredAll=false] Boolean 转换模型名的驼峰命名规则为表名的下划线命令规则39 [options.freezeTableName=false] Boolean 设置为true时,sequelize不会改变表名,否则可能会按其规则有所调整40 [options.name] Object 允有singular 和 plural两个属性的对象,在模型与其它模型关联时使用41 [options.name.singular=42 inflection.singularize(modelName)] String 43 [options.name.plural=44 inflection.pluralize(modelName)] String 45 [options.indexes] Array.<Object> 要建立的索引46 [options.indexes[].name] String 索引名,默认为模型名 + '_' + 字段名47 [options.indexes[].type] String 索引类型,仅用于 mysql,其值为:UNIQUE、 FULLTEXT 或 SPATIAL之一48 [options.indexes[].method] String 创建索引的方法(SQL中的USING 声明)。BTREE 或 HASH 可以在 mysql 和 postgres中支持,postgres中支持,还支持 GIST 和 GIN49 [options.indexes[].unique=false] Boolean 设置索引是否唯一,设置后会自动触发UNIQUE设置50 [options.indexes[]51 .concurrently=false] Boolean PostgreSQL 中在创建索引时不使用任务写锁定。仅 Postgres 适用52 [options.indexes[].fields] Array.<String | Object> 建立索引的字段数组。每个字段可以是一个字段名,sequelize 对象 (如 sequelize.fn),53 或一个包含:attribute (字段名)、length (创建前缀字符数)、order (列排序方向)、collate (较验的字段集合 (排序))54 [options.createdAt] String | Boolean 如果为字符串,则使用提供的值代替 createdAt 列的默认名,设置为flase则不添加这个字段。55 [options.updatedAt] String | Boolean 如果为字符串,则使用提供的值代替 updatedAt 列的默认名,设置为flase则不添加这个字段56 [options.deletedAt] String | Boolean 如果为字符串,则使用提供的值代替 deletedAt 列的默认名,设置为flase则不添加这个字段57 [options.tableName] String 模型所对应表的表名,设置freezeTableName 为 true时,才会严格使用模型名58 [options.getterMethods] Object 提供给 getter 调用的方法,与每列定义的访问器一样。如果为列定义了一个相同名称的 getter 方法,那么会通过这个方法获取值;如果未定义的名称与列不匹配,这将做为一个虚拟访问器;也用于设置多个值,但不能用在。59 [options.setterMethods] Object 提供给 setter 调用的方法,与每列定义的设置器一样。如果为列定义了一个相同名称的 setter 方法,那么会通过这个方法设置值;如果未定义的名称与列不匹配,这将做为一个虚拟访设置;也用于匹配多个值,但不用于逻辑删除。60 [options.instanceMethods] Object 提供给每个实例(DAO)的方法。如果通过sequelize对方法进行了重写,可以通过"this.constructor.super_.prototype"来调用原方法,如:this.constructor.super_.prototype.toJSON.apply(this, arguments)61 [options.classMethods] Object 添加到Model的类方法,如果通过sequelize对方法进行了重写,可以通过 this.constructor.prototype来调用原方法,如:this.constructor.prototype.find.apply(this, arguments)62 [options.schema='public'] String 63 [options.engine] String 64 [options.charset] String 65 [options.comment] String 66 [options.collate] String 67 [options.initialAutoIncrement] String MySQL中设置 AUTO_INCREMENT (自增)的初始值68 [options.hooks] Object 一个包含钩子函数的对象,这些函数会在生生命周期内某些事件发生之前或之后被调用。可添加的钩子函数有:beforeValidate, afterValidate, beforeBulkCreate, beforeBulkDestroy, beforeBulkUpdate, beforeCreate, beforeDestroy, beforeUpdate, afterCreate, afterDestroy, afterUpdate, afterBulkCreate, afterBulkDestory 和 afterBulkUpdate。每个属性可以是一个函数,或是一个包含一组函数的数组。69 [options.validate] Object 模型广泛验证对象。该验证会通过this。如果验证函数中有参数,则会被认为是异步的,并通过一个包含可选错误的回调函数形式的的调。
接下来说一下模型导入,大家可以想一下,我们一个项目中,如果只用一个数据库,但一个数据库中有好多张表,为了方便管理,我们最好将一个模型放一个js文件,独立编写,这样也方便分工合作,之后,可以把大家写的独立的model 合到我们的index.js文件,这里就需要模型导入了。
在这里补充点小知识
- Node--Sequlize搭建服务
- Sequlize、Express、Node fs综合项目架构
- Sequlize、Express、Node fs综合项目架构
- Ubunut服务器搭建Node服务
- node.js搭建https服务
- node.js 搭建简单服务
- 使用Node 搭建HTTPS服务
- node.js 搭建本地服务
- Node.js ORM框架Sequlize之表间关系
- Node.js ORM框架Sequlize之表间关系
- 使用node搭建UDP,TCP,HTTP服务
- 基于 Node.js 搭建 HTTP/2服务
- 使用node搭建一个简单服务
- node使用express搭建服务web前端(服务数据)。
- Web Server之通过Node.js快速搭建服务
- 用node js 搭建 webrtc 信令服务
- 在云服务器用Node.js搭建个人网站
- 使用node.js快速搭建简易本地HTTP服务
- 在hadoop集群上安装hive和mysql
- 以当前学习进度判断命令执行优先级!
- 并行开发笔记-3.使用互斥元(临界区)保护
- android中RGB颜色查询对照表
- 环境配置-mysql安装
- Node--Sequlize搭建服务
- 1002. 写出这个数
- App复活
- python dict 和set 详解
- 解决Maven的Could not calculate build plan的方法
- Marvell ESPRESSObin从NFS启动Linux
- Spring Boot (三) 热部署
- java上传文件实例
- mybatis的xml中使用foreach