首页 > 代码库 > nodejs+sequelize操作mysql数据库
nodejs+sequelize操作mysql数据库
前言:
本人对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数据库以后,执行:
- 退出数据库,执行quit退出,然后将配置文件的skip-grant-tables 这句话注释掉
- 重启mysql服务,先执行net stop mysql,在执行net start mysql
- 重新进入mysql数据库,这时就需要用户名和密码了,进入的命令如下:
mysql -uroot -p123456
2.创建目录及文件
写一个小案例,实现连接数据库,向表中插入数据,更新表中的数据,查询表中的数据。
采用express框架
工程文件如下:
是通过 express -e mysql-demo 直接生成的
新建一个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地址
nodejs+sequelize操作mysql数据库