Nodejs中koa2怎么连接mysql
导读:本文共5840.5字符,通常情况下阅读需要19分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 将查询结果转为对象或者数组在真实开发中,实际上某些查询结果应该放入到一个对象中JSON_OBJECT:()中是key-value的形式SELECTproducts.idasid,products.titleastitle,products.priceasprice,products.scoreasscore, JSON_OBJECT('id... ...
目录
(为您整理了一些要点),点击可以直达。将查询结果转为对象或者数组
在真实开发中,实际上某些查询结果应该放入到一个对象中
JSON_OBJECT:()中是key-value的形式
SELECTproducts.idasid,products.titleastitle,products.priceasprice,products.scoreasscore, JSON_OBJECT('id',brand.id,'name',brand.name,'rank',brand.phoneRank,'website',brand.website)asbrandFROMproductsLEFTJOINbrandONproducts.brand_id=brand.id;
在多对多关系中,我们希望查询到的是一个数组:
比如一个学生的多门课程信息,应该是放到一个数组中的;
数组中存放的是课程信息的一个个对象;
这个时候我们要JSON_ARRAYAGG和JSON_OBJECT结合来使用;
SELECTstu.id,stu.name,stu.age, JSON_ARRAYAGG(JSON_OBJECT('id',cs.id,'name',cs.name))ascoursesFROMstudentsstuLEFTJOINstudents_select_coursessscONstu.id=ssc.student_idLEFTJOINcoursescsONssc.course_id=cs.idGROUPBYstu.id;
mysql2的使用
安装mysql2:
npminstallmysql2
简单使用:
constmysql=require('mysql2');//1.创建数据库连接constconnection=mysql.createConnection({host:'localhost',port:3306,database:'coderhub',user:'root',password:'Coderwhy888.'});//2.执行SQL语句conststatement=`SELECT*FROMproductsWHEREprice>6000;`connection.query(statement,(err,results,fields)=>{console.log(results);});
如果我们想要在拿到数据后停止服务,可以在回调函数中写上:
connection.end()
完整代码:
connection.query(statement,(err,results,fields)=>{console.log(results);connection.end();});
Prepared Statement(预处理语句)
提高性能:将创建的语句模块发送给MySQL,然后MySQL编译(解析、优化、转换)语句模块,并且存储
它但是不执行,之后我们在真正执行时会给?
提供实际的参数才会执行;就算多次执行,也只会编译一次,所以性能是更高的;
强调:如果再次执行该语句,它将会从LRU(Least Recently Used) Cache中获取获取,省略了编译statement的时间来提高性能。
//2.执行SQL语句:使用?来对参数进行占位conststatement=`SELECT*FROMproductsWHEREprice>?ANDscore>?;`connection.execute(statement,[6000,7],(err,results)=>{console.log(results);});
Connection Pools(连接池)
前面我们是创建了一个连接(connection),但是如果我们有多个请求的话,该连接很有可能正在被占用,那么我们是否需要每次一个请求都去创建一个新的连接呢?
事实上,mysql2给我们提供了连接池(connection pools);
连接池可以在需要的时候自动创建连接,并且创建的连接不会被销毁,会放到连接池中,后续可以继续使用;
我们可以在创建连接池的时候设置LIMIT,也就是最大创建个数;
判断是否连接成功
constmysql=require('mysql2');//1.创建连接池constconnections=mysql.createPool({host:'localhost',port:3306,database:'coderhub',user:'root',password:'Coderwhy888.',connectionLimit:10});connections.getConnection((err,conn)=>{conn.connect((err)=>{if(err){console.log('连接失败:',err)}else{console.log('数据库连接成功~')}})})
简单使用数据库
constmysql=require('mysql2');//1.创建连接池constconnections=mysql.createPool({host:'localhost',port:3306,database:'coderhub',user:'root',password:'Coderwhy888.',connectionLimit:10});//2.使用连接池conststatement=`SELECT*FROMproductsWHEREprice>?ANDscore>?;`connections.execute(statement,[6000,7],(err,results)=>{console.log(results);});
Promise方式
constmysql=require('mysql2');//1.创建连接池constconnections=mysql.createPool({host:'localhost',port:3306,database:'coderhub',user:'root',password:'Coderwhy888.',connectionLimit:10});//2.使用连接池conststatement=`SELECT*FROMproductsWHEREprice>?ANDscore>?;`connections.promise().execute(statement,[6000,7]).then(([results,fields])=>{console.log(results);}).catch(err=>{console.log(err);});
sequelize
对象关系映射(ORM):是一种程序设计的方案:
从效果上来讲,它提供了一个可在编程语言中,使用虚拟对象数据库的效果;
Node当中的ORM我们通常使用的是sequelize;
Sequelize是用于Postgres,MySQL,MariaDB,SQLite和Microsoft SQL Server的基于Node.js 的ORM;
它支持非常多的功能;
如果我们希望将Sequelize和MySQL一起使用,那么我们需要先安装两个东西:
mysql2:sequelize在操作mysql时使用的是mysql2;
sequelize:使用它来让对象映射到表中;
npminstallsequelizemysql2
Sequelize的使用
Sequelize的连接数据库:
第一步:创建一个Sequelize的对象,并且指定数据库、用户名、密码、数据库类型、主机地址等;
第二步:测试连接是否成功;
const{Sequelize}=require('sequelize');constsequelize=newSequelize('coderhub','root','Coderwhy888.',{host:'localhost',dialect:'mysql'//连接的数据库类型:mysql,mongoose});sequelize.authenticate().then(()=>{console.log("连接数据库成功~");}).catch(err=>{console.log("连接数据库失败~",err);});
Sequelize的单表操作
const{Sequelize,DataTypes,Model,Op}=require('sequelize');constsequelize=newSequelize("coderhub",'root','Coderwhy888.',{host:'localhost',dialect:'mysql'})//1.首先我们需要将数据库中的一张表映射成一个class类classProductextendsModel{}Product.init({id:{type:DataTypes.INTEGER,primaryKey:true,//主键autoIncrement:true//自动增长},title:{type:DataTypes.STRING,allowNotNull:false//是否可以为空},price:DataTypes.DOUBLE,score:DataTypes.DOUBLE},{//与数据库的表进行映射的配置tableName:'products',createdAt:false,updatedAt:false,sequelize});//存放操作数据库的代码asyncfunctionqueryProducts(){//1.查询数据库中product表中所有的内容constresult1=awaitProduct.findAll({where:{//在这里配置条件price:{[Op.gte]:5000//意思是价格大于等于5000//gte:大于等于,gt:大于,lt:小于,lte:小于等于}}});console.log(result1);//2.插入数据constresult2=awaitProduct.create({title:"三星Nova",price:8888,score:5.5});console.log(result2);//3.更新数据constresult3=awaitProduct.update({price:3688},{where:{id:1}});console.log(result3);}queryProducts();//执行这个函数可以实现对数据库的操作
Sequelize的一对多操作
const{Sequelize,DataTypes,Model,Op}=require('sequelize');constsequelize=newSequelize("coderhub",'root','Coderwhy888.',{host:'localhost',dialect:'mysql'});//数据库的第一个表:主表classBrandextendsModel{};Brand.init({id:{type:DataTypes.INTEGER,primaryKey:true,autoIncrement:true},name:{type:DataTypes.STRING,allowNotNull:false},website:DataTypes.STRING,phoneRank:DataTypes.INTEGER},{tableName:'brand',createdAt:false,updatedAt:false,sequelize});//数据库的第二个表:附表classProductextendsModel{}Product.init({id:{type:DataTypes.INTEGER,primaryKey:true,autoIncrement:true},title:{type:DataTypes.STRING,allowNotNull:false},price:DataTypes.DOUBLE,score:DataTypes.DOUBLE,brandId:{field:'brand_id',type:DataTypes.INTEGER,references:{//这张表使用了Brand的id作为外键model:Brand,//product这张表使用了Brand这个表,所以product必须放在下面key:'id'}}},{tableName:'products',createdAt:false,updatedAt:false,sequelize});//将两张表联系在一起Product.belongsTo(Brand,{foreignKey:'brandId'//外键});asyncfunctionqueryProducts(){constresult=awaitProduct.findAll({include:{//这里是联合查询:意思是包含别的表的信息model:Brand}});console.log(result);}queryProducts();
Sequelize的多对多操作
const{Sequelize,DataTypes,Model,Op}=require('sequelize');constsequelize=newSequelize("coderhub",'root','Coderwhy888.',{host:'localhost',dialect:'mysql'});//Student表classStudentextendsModel{}Student.init({id:{type:DataTypes.INTEGER,primaryKey:true,autoIncrement:true},name:{type:DataTypes.STRING,allowNotNull:false},age:DataTypes.INTEGER},{tableName:'students',createdAt:false,updatedAt:false,sequelize});//Course表classCourseextendsModel{}Course.init({id:{type:DataTypes.INTEGER,primaryKey:true,autoIncrement:true},name:{type:DataTypes.STRING,allowNotNull:false},price:DataTypes.DOUBLE},{tableName:'courses',createdAt:false,updatedAt:false,sequelize});//StudentCourse表:关系表classStudentCourseextendsModel{}StudentCourse.init({id:{type:DataTypes.INTEGER,primaryKey:true,autoIncrement:true},studentId:{//与Student表建立关系type:DataTypes.INTEGER,references:{model:Student,key:'id'},field:'student_id'},courseId:{//与Course表建立关系type:DataTypes.INTEGER,references:{model:Course,key:'id'},field:'course_id'}},{tableName:'students_select_courses',createdAt:false,updatedAt:false,sequelize});//多对多关系的联系:StudentStudentCourseCourseStudent.belongsToMany(Course,{through:StudentCourse,foreignKey:'studentId',//这里是Student与StudentCourse,所以外键是studentIdotherKey:'courseId'//StudentCourse与Course,所以外键是courseId});//与上面类似Course.belongsToMany(Student,{through:StudentCourse,foreignKey:'courseId',otherKey:'studentId'});asyncfunctionqueryProducts(){constresult=awaitStudent.findAll({include:{//所有学生的选课情况model:Course}});console.log(result);}queryProducts();
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
Nodejs中koa2怎么连接mysql的详细内容,希望对您有所帮助,信息来源于网络。