首頁 > 軟體

資料庫連線池以及sequelize實現增刪改查等操作指南

2022-08-08 14:03:32

資料庫連線池

介紹資料庫連線池

資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是重新建立一個;釋放空閒時間超過最大空閒時間的資料庫連線來避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏。

通俗的理解就是: 資料庫連線池是程式啟動時建立足夠數量的資料庫連線物件,並將這些連線物件組成一個池,由程式動態的對池中的連線物件進行申請、使用和釋放。

優點

(1)避免應用程式頻繁的連線、斷開資料庫

(2)提供資料庫連線物件的使用頻率。

使用方法

(1)建立資料庫連線池:

mysql.createPool(config) 
    host:資料庫伺服器的地址
    port: 埠號
    user:連線資料庫的使用者名稱
    password:連線資料庫的密碼
    database:資料庫名
    connectionLimit:用於指定連線池中最大的連結數,預設屬性值為10.
    multipleStatements :是否允許執行多條sql語句,預設值為false

(2)從連線池中獲取一個連線

連線池名.getConnection(function(err,connection){
    執行的程式碼
})
 
//引數err:錯誤物件。連線失敗後的錯誤資訊
//引數connection:連線物件。若連線失敗,它就是undefined

(3)釋放連線物件(將連線物件放回連線池): connection.release();

(4)從連線池中移除連線物件: connection.destory();

(5)關閉該連線池:  連線池名.end();

資料庫存取中的ORM——sequelize模組

ORM

物件關係對映,主要解決物件導向程式設計與關係型資料庫之間不匹配的問題。

ORM的特點

  • 可以提高開發的效率
  • 不用直接寫SQL語句

sequelize模組——ORM的實現模組

基於promise的關係型資料庫ORM框架,這個庫完全採用JavaScript開發並且能夠用在Node.JS環境中,易於使用,支援多SQL方言(dialect)。它當前支援MySQL、MariaDB、SQLite、PostgreSQL、Sql Server 資料庫。

sequelize的特色

  • 強大的模型定義,支援虛擬型別。
  • 支援完善的資料驗證,減輕前後端的驗證壓力。
  • Sequelize的查詢非常全面和靈活。

sequelize的使用

資料庫內容:資料庫名稱為spj,資料庫表為 users表;

1、安裝sequelize:npm install sequelize    --->必須先安裝mysql的驅動模組(npm  install  mysql);

2、連線資料庫:建立sequelize的物件;

//匯入mysql模組
const mysql = require('mysql2');
//匯入sequelize模組
const Sequelize = require('sequelize');
//建立sequelize物件,引數分別為:資料庫名稱,資料庫型別,密碼,設定
var MySequelize = new Sequelize('spj','root','929TJ813',{
    host:'localhost',
    port:3306,
    dialect:'mysql',   //資料庫型別
    pool:{  //資料庫連線池
        max:20,  //最大連線物件的個數
        min:5,  //最小連線物件的個數
        idle:1000  //最長等待時間,單位為毫秒
    }
})
module.exports = MySequelize ;   //匯出建立的sequelize物件

3、建立資料模型:資料模型是一個類,對應的是資料庫中一張表;

const Sequelize =require('sequelize')
const MySequesize = require('../config/dbconfig');  //匯入建立的sequelize物件
//建立StudentModel模型,該模型對應的表名是student
var StudentModel = MySequesize.define('users',{
    sid:{
        type:Sequelize.INTEGER,  //表示屬性的資料型別
        field:'s_id',   //屬性對應的列名,若不定義field則表中的列名(sid)就是屬性名
        primaryKey:true,  //表示主鍵
        autoIncrement:true  //表示主鍵自增
    },
    sname:{
        type:Sequelize.STRING(50),
        field: 's_name',
        allowNull:false,   //表示當前列是否允許為空,false表示該列不能為空
        //unique:true    //表示該列的值必須唯一
    },
    sgender:{
        type:Sequelize.STRING(4),
        field:'s_gender',
        allowNull: false
    },
    sbirthday:{
        type:Sequelize.DATE,
        field:'s_birthday',
        allowNull:false
    },
    saddress:{
        type:Sequelize.STRING(100),
        field:'s_address',
        allowNull:false
    },
    sage:{
        type:Sequelize.INTEGER,
        field:'s_age',
        allowNull:false
    }
},{
    freezeTableName:true, //true表示使用給定的表名,false表示模型名後加s作為表名
    timestamps:false  //true表示給模型加上時間戳屬性(createAt、updateAt),false表示不帶時間戳屬性
})
//同步資料庫,force的值為false,表若存在則先刪除後建立,force的值為true表示表若存在則不建立
var users = StudentModel.sync({force:false});
 
module.exports = StudentModel;   //匯出模型

4、使用sequelize實現增刪改查 。

const StudentModel = require('../../db/model/StudentModel');
const Sequelize = require('sequelize')
//插入資料
StudentModel.create({
    sname:'關羽',
    sgender:'男',
    sbirthday:'1998-12-28',
    saddress:'陝西寶雞'
}).then(result=>{
    console.log("插入成功!",result);
}).catch(err=>{
    console.log("插入失敗!",err);
})
 
//查詢資料
StudentModel.findAll({
    raw:true   //查詢出來只有需要的資料,沒有別的內容
}).then(data=>{
    console.log(data);
})
 
//刪除記錄
StudentModel.destroy({
    where:{
        sid:2
    }
}).then(result=>{
    console.log("刪除成功!",result)
}).catch(err=>{
    console.log("刪除失敗!",err);
})
 
//更新記錄
StudentModel.findOne({
    where:{
        sid:3
    }
}).then(users=>{
    users.update({
        sname:'張飛',
        sgender:'男'
    }).then(result=>{
        console.log("更新成功!",result)
    }).catch(err=>{
        console.log("更新失敗!",err);
    })
}).catch(error=>{
    console.log("查無此人!",error);
})
 
//查詢部分欄位
StudentModel.findAll({
    attributes:['sname','saddress'],
    raw:true
}).then(result=>{
    console.log(result);
}).catch(err=>{
    console.log(err);
})
 
//聚合函數
StudentModel.findAll({
    attributes:[[Sequelize.fn('COUNT',Sequelize.col('s_id')),"記錄總數"]],  //col裡面必須放的是列名
    raw:true
}).then(result=>{
    console.log(result)
})

5、使用sequelize實現模糊查詢等內容。

const StudentModel = require('../../db/model/StudentModel');
const Op = require('sequelize').Op;   //引入sequelize模組的Op操作符
 
//模糊查詢
StudentModel.findAll({
    where:{
        sname:{
            [Op.like]:'張%'
        }
    },
    raw:true
}).then(result=>{
    console.log(result);
})
 
//between:查詢年齡在12到18之間的人的資訊
StudentModel.findAll({
    where:{
        sage:{
            [Op.between]:[12,18]
        }
    },
    raw:true
}).then(result=>{
    console.log(result);
})
 
//in:查詢地址是'陝西西安‘和'陝西商洛‘的記錄
StudentModel.findAll({
    where:{
        saddress:{
            [Op.in]:['陝西西安','陝西商洛']
        }
    },
    order:[
      ['sage','desc']   //查詢結果按照sage的降序排列
    ],
    raw:true
}).then(result=>{
    console.log(result);
})
 
//and和or:查詢性別為'男‘,並且地址是‘陝西寶雞'的記錄
StudentModel.findAll({
    where:{
        [Op.and]:[   //把and改為or即為或時間
            {
                sgender:{
                    [Op.eq]:'男'
                }
            },
            {
                saddress:{
                    [Op.eq]:'陝西寶雞'
                }
            }
        ]
    },
    raw:true
}).then(result=>{
    console.log(result);
})
 
//limit和offset:分頁查詢
StudentModel.findAll({
    limit:3,   //查詢的記錄數
    offset:1,  //從索引值為幾的記錄開始查詢(查詢的起始位置),所有資料的索引值從0開始
    raw:true
}).then(result=>{
    console.log(result);
})

總結

到此這篇關於資料庫連線池以及sequelize實現增刪改查等操作指南的文章就介紹到這了,更多相關資料庫連線池及sequelize增刪改查內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com