| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- // 引入封装好的类
- 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;
|