// 引入封装好的类 var MySqllite = require('../../common/moudles/MySqllite.js'); // 时间模块 var modelsSillyDatetime = require('silly-datetime'); var modelsMoment = require('moment'); /** * 用于自动化同步数据表结构 * 只适用于 SQLLite 数据库 * * 使用说明,首先配置 * this.sqlUpdate 你要执行的sql语句 * * // 引入该模块 * var MigrateSqllite = require('../common/moudles/MigrateSqllite.js'); * * 然后在你要同步表结构调用 * MigrateSqllite.find().start(); * */ class MigrateSqllite { // 记录当前被new 出来的类 static thisObjModel = null; // 类被实例化的时候立即被调用 constructor() { // 变量定义 /** * 定义要同步的表结构 */ this.sqlUpdate = [ // { // // 格式为时间戳,时间戳不要出现重复 // "key" : "202205011055", // // 要执行的sql语句 // "sql" : "CREATE TABLE users(id varchar(255) PRIMARY KEY NOT NULL, name TEXT NOT NULL, age integer(11) NOT NULL, address varchar(255) );", // }, // { // "key" : "202205011056", // "sql" : "INSERT INTO users (id, name, age) VALUES ('1', '姓名', 3);", // }, // { // "key" : "202205011057", // "sql" : "INSERT INTO users (id, name, age) VALUES ('2', '姓名', 3);", // }, { "key" : "202205050800", "sql" : "CREATE TABLE user_obj(id varchar(255) PRIMARY KEY NOT NULL, del integer(11), time VARCHAR(255), user_name varchar(255), state integer(11), sum integer(11) );", }, // { // "key" : "202205050801", // "sql" : "CREATE TABLE user_obj_url(user_obj_id varchar(255) PRIMARY KEY NOT NULL, del integer(11), time VARCHAR(255), sec_uid varchar(255), state integer(11) );", // }, // { // "key" : "202205050802", // "sql" : "CREATE TABLE user_obj_url_video(user_obj_id varchar(255), del integer(11), time VARCHAR(255), aweme_id varchar(255), state integer(11) );", // }, // { // "key" : "202205050803", // "sql" : "CREATE TABLE user_obj_url_video_comment(id varchar(255) PRIMARY KEY NOT NULL, aweme_id varchar(255), del integer(11), time VARCHAR(255), create_time varchar(255), text text, nickname varchar(255), uid varchar(255), short_id varchar(255), sec_uid varchar(255), unique_id varchar(255) );", // }, { "key" : "202209030909", "sql" : "CREATE TABLE project(id varchar(255) PRIMARY KEY NOT NULL, del integer(11), time VARCHAR(255), name varchar(255), model_main varchar(255) );", }, { "key" : "202307032139", "sql" : "CREATE TABLE name_only(id varchar(255) PRIMARY KEY NOT NULL, del integer(11), time VARCHAR(255), name varchar(255), type integer(11) );", }, ]; } /** * 单例模式的核心在于该方法 * 单例模式的调用案例 */ static find() { // 当前对象不存在的时候 if (this.thisObjModel == null) { // new 出自己本身对象 this.thisObjModel = new this(); } // 返回自己本身对象 return this.thisObjModel; } /** * 开始同步数据 */ start() { this.migrateCreateBool(function(result) { MigrateSqllite.find().sqlStart(0, function(migrateSqlliteRes) { console.log("数据表同步数据完成"); }); }); } /** * 判断 migrate 表是否存在 * callback 成功返回后的回调方法,比如我执行完语句后,要返回的指定方法,例如 function (result) {} */ migrateCreateBool(callback) { var sql = 'SELECT name FROM sqlite_master WHERE type="table"'; // 因为操作数据库是异步的 MySqllite.find().query(sql, 'all', function (err, result) { // 判断 migrate表是否存在 var migrateTabelBool = false; if (result.length > 0) { for (var key in result) { if (result[key].name === 'migrate') { migrateTabelBool = true; } } } // 如果不存在 if (migrateTabelBool === false) { // 创建表 var createTable = 'CREATE TABLE migrate(name varchar(255), time VARCHAR(255));'; MySqllite.find().query(createTable, null, function (err, result) { callback(result) }); } else { callback("migrate 已经存在了") } }); } /** * 开始执行sql语句 * sum 当前执行的是第几个数组下标,当数组下标是最后一个,并且执行完成后,则改方法调用结束 * callback 成功返回后的回调方法,比如我执行完语句后,要返回的指定方法,例如 function (result) {} */ sqlStart(sum, callback) { if (this.sqlUpdate.length <= 0) { return callback("同步完成") } var thisSqlUpdate = this.sqlUpdate[sum]; this.sqlMigrate(thisSqlUpdate, function(sqlMigrateErr, sqlMigrateRes) { console.log(sqlMigrateRes) if (sum >= (MigrateSqllite.find().sqlUpdate.length - 1)) { return callback("表结构同步完成") } return MigrateSqllite.find().sqlStart(sum +=1, callback) }) } /** * 执行sql语句,更新到 migrate 里 * thisSqlUpdate 当前执行的sql语句 * callback 成功返回后的回调方法,比如我执行完语句后,要返回的指定方法,例如 function (err, result) {} */ sqlMigrate(thisSqlUpdate, callback) { // 转换成你要的时间格式 var date = modelsSillyDatetime.format(new Date(), 'YYYY-MM-DD HH:mm:ss'); // 判断是否执行过记录了 // 查询单条数据,只会返回一条数据 // var sql = "SELECT * FROM users WHERE id = '38c7e90c-39d8-4c6b-bc70-a3d837f60c42';"; var sql = "SELECT * FROM migrate WHERE name = '" + thisSqlUpdate['key'] + "';"; // 因为操作数据库是异步的 MySqllite.find().query(sql, 'get', function (err, result) { // 此时说明是不存在的 if (result === undefined || result === null) { // 所以我们采用回调的方法,来实现同步 MySqllite.find().query(thisSqlUpdate['sql'], null, function (err, result) { // 新增执行过的记录 var sqlAddMigrate = "INSERT INTO migrate (name, time) VALUES ('" + thisSqlUpdate['key'] + "', '" + date + "');"; MySqllite.find().query(sqlAddMigrate, null, function (err, result) { callback(null, "表结构同步 = " + thisSqlUpdate['key'] + " 执行完成") }); }); return true; } // 已经执行过了,则就不需要执行了 callback(null, thisSqlUpdate['key'] + " 已经执行过了") }); } } module.exports = MigrateSqllite;