zoukankan      html  css  js  c++  java
  • 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:mysqlmysql-5.7.16-winx64"

        datadir  填写你数据文件的路径:如datadir = "D:mysqlmysql-5.7.16-winx64data"

        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  直接生成的

     

    新建一个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地址

  • 相关阅读:
    T4模板使用记录,生成Model、Service、Repository
    sortablejs + vue的拖拽效果 列表个数不固定 刷新后保持拖拽后的效果
    vue获取input焦点,弹框后自动获取input焦点
    vue proxy 跨域代理
    vue 同步 $nextTick setTimeout 执行的顺序
    js手写日历插件
    js数组随机排序
    vue自定义插件
    elementui 自定义表头 renderHeader的写法 给增加el-tooltip的提示
    awit的用法,等待执行结果
  • 原文地址:https://www.cnblogs.com/y-yxh/p/6005729.html
Copyright © 2011-2022 走看看