使用MySQL数据库

项目中需要使用MySQL数据库时需要添加连接MySQL数据库的逻辑文件和代码段调用数据库。需要注意的是MySQL需要一定程度的人工维护、实时的调整索引等达到最优的使用效果。仅通过代码段调用写入或查询数据的话,数据增多时可能会导致查询时间越来越长。如果对方由数据库运维则无需担心这点。请了解这些问题后再使用以下方法。

使用流程

1. 请网管创建测试用数据库

1. 添加链接数据库用的业务功能

2. 视口中添加调用链接方法的接口

 

一、测试数据库:

1.具体操作由网管完成,需要向网管咨询获取以下配置信息

  {
    "host":"数据库IP",
    "database":"数据库名称",
    "username":"数据库用户名",
    "password":"数据库密码",
    "port":"数据库端口号"
  }
  
2.同时需要在本地添加MySQL客户端,测试时使用。使用以下命令或在软件中心安装MySQL Workbench,不会操作的话找网管安装。
sudo apt install mysql-workbench

 

二、添加业务功能

1. wide中“ 业务功能列表”中新建事件类型的业务功能

如:创建 connectsql/main.js

2.编辑文件,添加新事件处理

如:新建 connect0mysql

3.自定义初始化,调用事件“ connect0mysql”。放开 customInit的注释代码添加调用

4.编辑事件,添加模板。编辑事件“ connect0mysql”,代码段管理中选择右上的 应用模板,选择 其他事件中的 链接mysql数据库

5.编辑代码,添加配置信息

代码段中手动添加tmp_data的声明,搜索“ 设置文档”,修改为从网管处获取的配置信息。

6.添加MySQL的表定义信息

  1. 修改变量“modData”中的 tablename为实际使用的表名, column为该表的真实字段名称,需要修改多个表则需要再这里将表和字段名全部添加到这里。
  2. 修改“otherConfig”的表设置,注意这里的设置需要与对方的设置保持一致,不填写则会使用默认配置

注意:

  • 主键如: id字段为特殊字段,如果对方使用了自增的id字段一般不需要在此设置, createdAtupdatedAt同样是特殊字段,如果数据库自动添加也不需要在这里指定
  • 表中字段如何定义参见官方文档: 表定义
  • 字段的类型参见官方文档: 字段类型
  • 其他设置部分官方文档为: 设置信息

 

三、调用接口的书写

1.查询

构造查询条件,构造方法参见文档: 查询条件

查找表“userinfo”中满足条件的数据

   /*INSBEGIN:CUSTOM*/
      function() {

        return when.promise(function(resolve, reject) {
          var setinter = setInterval(function() {
            if (global.sequelizeSQLCache) {
              clearInterval(setinter);
              resolve(global.sequelizeSQLCache);
            }
          }, 20);
        });
      },
      function(squeInst) {
        var Sequelize = require('sequelize');
        var tableName = "userinfo"; // 需要查询的mysql表名
        var incomeTable = squeInst.models[tableName];
        if (_.isEmpty(incomeTable)) {
          var Err = new LogicError();
          Err.errorCode = -38;
          Err.message.message.tips = "获取MySQL数据库信息失败!!!";
          throw Err;
        }
        var Op = Sequelize.Op;
        //查询条件文档 https://github.com/sequelize/sequelize/blob/v4/docs/querying.md#operators
        // 更改查询条件,例子中的username为表中字段,需要更改这个字段
        var q = {
          "where": {
            "username": {
              [Op.like]: '%%'
            }
          },
          "limit": 10 || 10,
          "offset": 0 || 0
        };

        return incomeTable.findAndCountAll(q)
          .catch(function(err) {
          console.log("Error ", err);
          var Err = new LogicError();
          Err.errorCode = -38;
          Err.message.message.tips = "获取MySQL数据库信息失败!!!";
          throw Err;
        });
      },
      function(modInsts) {
        tmp_data.total = modInsts.count;
        var ret = [];
        _.each(modInsts.rows, function(v, k) {
          var whiteList = {};
          _.extend(whiteList,v.dataValues);
          ret.push(whiteList);
        });
        return ret;
      },
    /*INSEND:CUSTOM*/
  

2.更新

更新指定字段信息或创建一条信息,这里的创建可以修改修改为判断uid值是否存在来执行,则会少做一次查询,如果不清楚则不要更改

   /*INSBEGIN:CUSTOM*/
      function() {
        return when.promise(function(resolve,reject){
          var setinter = setInterval(function(){
            if(global.sequelizeSQLCache){
              clearInterval(setinter);
              resolve(global.sequelizeSQLCache);
            }
          },20);
        });

      },
      function(seqsql){

        var uid="2";//这里修改为字段ID
        var tableName = "user";//这里修改为需要使用mysql表名
        var sqlData =  {"first_name":"newname","lastName":"newlastname"} // 这里为需要更新或新建的数据
        var incomeTable = seqsql.models[tableName];
        incomeTable.findByPk(uid).then(function(data){
          if(data){
            data.update(sqlData);
          }else{
            incomeTable.create(sqlData);
          }
        }).catch(function(err){
          console.log("Err ",err);
          var Err = new LogicError();
          Err.errorCode = -38;
          Err.message.message.tips = "数据库更新失败!!!";
          throw Err;
        });
      },
    /*INSEND:CUSTOM*/
  

3.删除

查找数据库中“user”表中字段“status”为“inactive”的所有字段,对查找到的字段执行删除动作

   /*INSBEGIN:CUSTOM*/
      function() {
        return when.promise(function(resolve,reject){
          var setinter = setInterval(function(){
            if(global.sequelizeSQLCache){
              clearInterval(setinter);
              resolve(global.sequelizeSQLCache);
            }
          },20);
        });

      },
      function(seqsql){

        var tableName = "user";//这里修改为需要使用mysql表名
        var incomeTable = seqsql.models[tableName];
        incomeTable.destroy({
        	where: {
        		status: 'inactive'
        	}
        }).catch(function(err){
          console.log("Err ",err);
          var Err = new LogicError();
          Err.errorCode = -38;
          Err.message.message.tips = "数据库更新失败!!!";
          throw Err;
        });
      },
    /*INSEND:CUSTOM*/
  

 

4.批量更新

满足条件id为1或条件id为2的字段执行更新,条件请参照: 查询条件自行构建

   /*INSBEGIN:CUSTOM*/
      function() {
        return when.promise(function(resolve,reject){
          var setinter = setInterval(function(){
            if(global.sequelizeSQLCache){
              clearInterval(setinter);
              resolve(global.sequelizeSQLCache);
            }
          },20);
        });

      },
      function(seqsql){

        var tableName = "user";//这里修改为需要使用mysql表名
        var incomeTable = seqsql.models[tableName];
        var Op = Sequelize.Op;
		return incomeTable.update({rank:1.8},{where:{
        [Op.or]:[{id:1},{id:2}]
        }})
        .spread(function(affectedCount, affectedRows){
				console.log("affectedCount & affectedRows",affectedCount,affectedRows);
        }).catch(function(err){
          console.log("Err ",err);
          var Err = new LogicError();
          Err.errorCode = -38;
          Err.message.message.tips = "数据库更新失败!!!";
          throw Err;
        });
      },
    /*INSEND:CUSTOM*/
  

 

注意:以上代码段仅为最基础的功能,更多功能请查询官方文档构建

查询条件

可调用方法