设为首页 收藏本站
查看: 1443|回复: 0

[经验分享] nodejs+sequelize操作mysql数据库

[复制链接]

尚未签到

发表于 2017-2-24 09:59:04 | 显示全部楼层 |阅读模式
前言:
  本人对mysql不是很熟悉,只会命令行的简单增删改查。有些观点可能不到位请谅解。
  sequelize是针对node.js和io.js开发的基于ORM的框架,它支持的数据库包括:PostgreSQL、 MySQL、MariaDB、 SQLite 和 MSSQL。

目录:
  1、安装mysql
  2、创建目录及文件
  3、连接数据库并定义模型
  4、操作数据库(增删改查)
  5、sequelize框架的API泛解

1.安装mysql
  安装环境:win7 x64


  • 先去官网下载最新的版本的mysql,进入官网以后,点击MySQL Community Server,就可以看到mysql最新版本的各种下载版本(如32位还是64位,mis格式后者zip格式)我下载的是5.7.16版本的,zip格式,然后解压即可。
  • 添加环境变量:就是将你解压后的文件bin路径添加到path环境变量中。
  • 打开cmd进入压缩后的bin文件下:
      执行:mysqld --initialize   这个必须要执行,直接初始化mysql,用来生成data文件夹


  • 解压后的文件夹根目录下面有一个配置文件my-default.ini文件:
      basedir 填写你解压后的跟文件路径,如:basedir = "D:\mysql\mysql-5.7.16-winx64"
      datadir  填写你数据文件的路径:如datadir = "D:\mysql\mysql-5.7.16-winx64\data"
      port 一般填3306
      在[mysqld]下面添加:skip-grant-tables  (这句话主要是用来启动mysql省略用户名和密码用的,网上说第一次启动mysql默认是不需要用户名和密码,不过我还是建议你加上这一句,等设置好用户名和密码以后,在去掉这句话)
      修改后,保存。


  • 在bin目录下执行mysqld -install安装mysql
  • 安装成功以后就可以使用net start mysql命令来启动mysql服务器了。
  • mysql服务器启动和停止命令分别是:
      停止:输入 net stop mysql
      启动:输入 net start mysql


  • 进入mysql数据库:
      直接在bin目录下输入mysql,再输入use mysql,即可进入mysql数据库(无需用户名和密码)


  • 设置用户名和密码:
       进入mysql数据库以后,执行:


    update user set authentication_string=password('123456') where user='root' and Host = 'localhost';

    此处设置用户名为root,密码为123456。



  • 退出数据库,执行quit退出,然后将配置文件的skip-grant-tables 这句话注释掉
  • 重启mysql服务,先执行net stop mysql,在执行net start mysql
  • 重新进入mysql数据库,这时就需要用户名和密码了,进入的命令如下:  
      mysql -uroot -p123456

2.创建目录及文件
  写一个小案例,实现连接数据库,向表中插入数据,更新表中的数据,查询表中的数据。
  采用express框架
  工程文件如下:
  是通过  express  -e  mysql-demo  直接生成的
DSC0000.png


新建一个mysql的配置文件:
  在工程的根目录下创建config文件夹,config/index.js
  在index.js文件中添加如下代码:



'use strict'
var all = {
sequelize:{
username: 'root',
password: '111111',
database: 'test',
host: "localhost",
dialect: 'mysql',
define: {
underscored: false,
timestamps: true,
paranoid: true
}
}
};
module.exports = all;
定义数据表模型:
  在工程根目录下新建model文件夹,model/user.js
   在user.js文件中添加如下代码:



'use strict'
module.exports = function(sequelize,DataTypes){
var User = sequelize.define('user',{
id:{
type:DataTypes.UUID,
primaryKey:true,
allowNull:false,
defaultValue:DataTypes.UUIDV1
},
name:{
type:DataTypes.STRING
},
age:{
type:DataTypes.INTEGER
},
height:{
type:DataTypes.INTEGER
},
weight:{
type:DataTypes.INTEGER
}
},{
freezeTableName: true
});
return User;
};
freezeTableName: true  这个选项表示,数据库中的表明与程序中的保持一致,否则数据库中的表名会以复数的形式命名
连接数据库:
  在工程根目录下新建sqldb文件夹,sqldb/index.js
  在index.js文件中添加如下代码:



'use strict'
var config = require('../config');
var Sequelize = require('sequelize');
var db = {
sequelize:new Sequelize(config.sequelize.database,config.sequelize.username,config.sequelize.password,config.sequelize)
};
db.User = db.sequelize.import('../model/user.js');
module.exports = db;
  最后在app.js文件中引入sqldb/index.js文件就完成了数据库的连接和数据表的建立。
  在app.js文件加入如下代码:



var sqldb = require('./sqldb');
sqldb.sequelize.sync({force: false}).then(function() {
    console.log("Server successed to start");
}).catch(function(err){
    console.log("Server failed to start due to error: %s", err);
});
sqldb.sequelize.sync接口用于同步模型到数据库。
4.操作数据库(增删改查)
  向user表中插入数据:
  在routes/index.js文件中加入如下代码:



router.post('/add/user',function(req,res,next){
console.log("+++++++++++++++++++++++");
var saveUser = {
name:req.body.name,
age:req.body.age,
height:req.body.height,
weight:req.body.weight
};
return db.sequelize.transaction(function(t){
console.log("+++++++++++++++++++");
return User.create(saveUser,{
transaction:t
}).then(function(result){
res.send(result);
}).catch(function(err){
console.log("发生错误:" + err);
});
})
});
  查询数据表中的数据(以id字段来查询):
  在routes/index.js文件中加入如下代码:



router.get('/get/user/:userid',function(req,res,next){
return db.sequelize.transaction(function(t){
return User.findOne({
id:req.params.userid
},{
transaction:t
}).then(function(result){
res.send(result);
}).catch(function(err){
console.log("发生错误:" + err);
});
});
});
  更新数据:



router.post('/update/user/age',function(req,res,next){
return db.sequelize.transaction(function(t){
return User.findById(req.body.userid,{
transaction:t
}).then(function(user){
return user.update({
age:req.body.age
},{
transaction:t
}).then(function(result){
res.send(result);
}).catch(function(err){
console.log("发生错误:" + err);
});
})
})
});
  这里有一点,不知道是不是bug,我是先查询,然后再更新,如果以id来查询,查到的一直是数据表中的第一个数据,无赖改成findByid的形式查询就可以了。(如果只查询,不更新的话,采用findOne即可,暂时不知道是什么原因)

5.sequelize框架API泛解
  sequelize目前我使用到的api分为两大类,一类属于sequelize,一类属于model。
  sequelize类是是引用sequlize模块后获取一个顶级对象,我们通过它来创建sequlize实例,sequelize最常用的API是transaction(启动事物API接口),一般操作表的接口都会先调用这个接口,如上面代码中的:



return db.sequelize.transaction(function(t){
return User.findOne({
......
})
});   

  要查询表数据,先要调用sequelize的transaction接口来启动事物。
  model类API:model类的API主要用于数据表的内部操作。
  如findOne,查找数据。
  create,插入数据。
  demo地址

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346477-1-1.html 上篇帖子: ubuntu14.04下nodejs + npm + bower的安装、调试和部署 下篇帖子: nodeJS express框架 中文乱码解决办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表