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數據庫以后,執行:

     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地址

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM