MongoDB数据库转达梦数据库随记(nodejs)

623 阅读3分钟

达梦数据库连接

达梦数据库安装不做过多赘述,有需要的可自行去搜索达梦数据库安装教程。

目前使用的是DataGrip 工具连接的达梦数据库, DataGrip是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql、创建表、创建索引以及导出数据等。 是 JetBrains 发布的多引擎数据库环境,支持 MySQL 和 PostgreSQL,Microsoft SQL Server 和 Oracle,Sybase,DB2,SQLite,还有 HyperSQL,Apache Derby 和 H2。

在安装好DataGrip工具之后进行达梦数库驱动程序添加

WX20230901-114832@2x.png

WX20230901-115112@2x.png 驱动程序文件的位置一般在你安装的达梦数据库/source/drivers/jdbc 中(如果直接连接的是服务器上的达梦数据库本地没有安装,则只需要下载驱动程序DmJdbcDriver18.jar 文件到本地选中即可), 选完驱动程序文件后,在类中可以选择 dm.jdbc.driver.DmDriver

WX20230901-115136@2x.png url模版选择进行添加 :

jdbc:dm://{host}:{port} 或者 jdbc:dm://{host::localhost}?[:{port::5236}][/DMSERVER?schema={database}] 两个进行任选一个就行

做完以上操作之后就可以进行达梦数据库创建并使用了

创建达梦数据库

WX20230901-142531@2x.png

WX20230901-135306@2x.png 填写上主机名,端口号,用户名密码就可进行测试连接,连接通过则达梦数据库成功连接。

WX20230901-143138@2x.png 创建好数据库,新建好数据库表即可进行以下操作了。

MongoDB语句转换为达梦数据库可执行的sql语句

使用navicat工具对mongoDB数据库表格进行导出的时候

  • 导出格式为js格式时,会导出MongoDB数据库中自带的_id和__v 字段 ,在解析的时候需要将这两个自带的字段进行去除(方法一)
  • 导出格式为json格式时,可以进行选择需要导出哪些字段,顾可将自带的_id和__v 字段去掉,则可使用方法二进行语句转换。
  • 然后执行程序将文件转换为达梦数据库可执行的sql 语句并输出文件。

主要思路为:

  1. 读取MongoDB数据库表文件
  2. 去除无用属性
  3. 拼接达梦数据库可执行语句
  4. 输出达梦数据库语句文件

以下代码为将MongoDB语句转换为达梦数据库插入语句的代码

方法一:
// 将导出的MongoDB.js 文档准换为.sql 文件
const fs = require("fs");
const path = require('path');
// 调用转换函数并指定 MongoDB 和 达梦数据库 脚本的路径
const mongodbScriptPath = '/file/BaseFile.js'; // 需要转换的MongoDB文件
const mysqlScriptPath = '/file/BaseFile_convert.sql'; // 转换过后的SQL文件
// 读取BaseFile.js文件内容
const mongoDbFilePath = path.resolve(__dirname, mongodbScriptPath);
const mongoDbContent = fs.readFileSync(mongoDbFilePath, 'utf8');
// 根据代码语法结构分割字符串
const parts = mongoDbContent.split('.insert(');
if (parts.length <= 1) {
  console.log('未找到插入语句部分');
  process.exit(1);
}
let sqlStatements = '';
// 处理每个插入语句
for (let i = 1; i < parts.length; i++) {
      // 去掉无用的属性
    var objStr = parts[i];
    var newStr = objStr.slice(0, objStr.lastIndexOf('}') + 1);
    console.log(newStr);
    var insertStatementNew = newStr.replace(/ObjectId\("[a-fA-F0-9]+"\)/g, "''");
    var insertStatement = insertStatementNew.replace(/NumberInt\("[a-fA-F0-9]+"\)/g, "''");
    // 解析插入语句为对象数组
    var data = Function(`return ${insertStatement}`)();
    // 构建INSERT INTO语句
    var count = 1;
    var length = Object.keys(data).length;
    var keys = "";
    var values = "";
    for(var key in data) {
      count++;
      if(key != "_id" && key != "__v" ){
        if(count >= length){
          keys += key;
          values += "'" + data[key] + "'";
        } else {
          keys += key + ",";
          values += "'" + data[key] + "',";
        }
      }
  }
    const tableName = 'message';
    const baseName = 'KSMQ_TEST_WQ';
    const insertSql = `INSERT INTO ${baseName}.${tableName} (${keys}) VALUES (${values});\n`;
    sqlStatements += insertSql;
}

// 输出转换过后的MySQL语句文件
const outputFilePath = path.resolve(__dirname, mysqlScriptPath);
fs.writeFileSync(outputFilePath, sqlStatements, 'utf8');
console.log('注意:导出的MongoDB数据库文件格式必须为js文件才能进行转换成功');

方法二:转换JSON文件

// 将导出的MongoDB.json 文档准换为.sql 文件
const { json } = require("express");
const fs = require("fs");
const path = require('path');
// 调用转换函数并指定 MongoDB 和 转换过后的 脚本的路径
const mongodbScriptPath = '/file/BaseFile.json'; // 需要转换的MongoDB文件
const mysqlScriptPath = '/file/BaseFile_convert.js'; // 转换过后的sql文件
// 读取MongoDB.js文件内容
const mongoDbFilePath = path.resolve(__dirname, mongodbScriptPath);
const mongoDbContent = fs.readFileSync(mongoDbFilePath, 'utf8');
var mongoDbContentJson = JSON.parse(mongoDbContent);
var contentList = mongoDbContentJson.RECORDS;
// 根据代码语法结构分割字符串
if (contentList.length <= 1) {
  console.log('未找到插入语句部分');
  process.exit(1);
}
console.log("length-->" + contentList.length)
let sqlStatements = '';
// 处理每个插入语句
for (let i = 0; i < contentList.length; i++) {
  // 去掉无用的属性
  var insertStatement = contentList[i];
  // 解析插入语句为对象数组
  var data = Function(`return ${JSON.stringify(insertStatement)}`)();
  // 构建INSERT INTO语句
  var count = 0;
  var length = Object.keys(data).length;
  var keys = "";
  var values = "";
  for(var key in data) {
      count++;
      if(count >= length){
        keys += key;
        values += "'" + data[key] + "'";
      } else {
        keys += key + ",";
        values += "'" + data[key] + "',";
      }
  }
    const tableName = 'BaseFile';
    const dataName = 'MAINDATA_TEST_WQ';
    const insertSql = `INSERT INTO ${dataName}.${tableName} (${keys}) VALUES (${values});\n`;
    sqlStatements += insertSql;
}

// 输出转换过后的MySQL语句文件
const outputFilePath = path.resolve(__dirname, mysqlScriptPath);
fs.writeFileSync(outputFilePath, sqlStatements, 'utf8');
console.log('注意:导出的MongoDB数据库文件格式必须为json文件才能进行转换成功');

注:如果在处理达梦数据库中字段名与关键字冲突的情况下,您可以考虑以下几种方法:

  1. 使用引号: 尝试使用双引号 " " 将字段名称括起来。有些数据库支持使用双引号来将字段名称视为普通标识符,而不是关键字。以上代码中未对该种情况进行处理

image.png 2. 修改字段名: 考虑将冲突的字段名称进行修改,以避免关键字冲突。

最后将生成的文件在达梦数据库中进行导入就可以了。

WX20230901-142954@2x.png

题外话: 如何将DataGrip汉化?

打开DataGrip,在设置中的插件选项中搜索Chinese,选中第一个进行安装,安装完成之后进行DataGrip重启就可以了

WX20230901-141144@2x.png