MigrateSqllite.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. // 引入封装好的类
  2. var MySqllite = require('../../common/moudles/MySqllite.js');
  3. // 时间模块
  4. var modelsSillyDatetime = require('silly-datetime');
  5. var modelsMoment = require('moment');
  6. /**
  7. * 用于自动化同步数据表结构
  8. * 只适用于 SQLLite 数据库
  9. *
  10. * 使用说明,首先配置
  11. * this.sqlUpdate 你要执行的sql语句
  12. *
  13. * // 引入该模块
  14. * var MigrateSqllite = require('../common/moudles/MigrateSqllite.js');
  15. *
  16. * 然后在你要同步表结构调用
  17. * MigrateSqllite.find().start();
  18. *
  19. */
  20. class MigrateSqllite {
  21. // 记录当前被new 出来的类
  22. static thisObjModel = null;
  23. // 类被实例化的时候立即被调用
  24. constructor() {
  25. // 变量定义
  26. /**
  27. * 定义要同步的表结构
  28. */
  29. this.sqlUpdate = [
  30. // {
  31. // // 格式为时间戳,时间戳不要出现重复
  32. // "key" : "202205011055",
  33. // // 要执行的sql语句
  34. // "sql" : "CREATE TABLE users(id varchar(255) PRIMARY KEY NOT NULL, name TEXT NOT NULL, age integer(11) NOT NULL, address varchar(255) );",
  35. // },
  36. // {
  37. // "key" : "202205011056",
  38. // "sql" : "INSERT INTO users (id, name, age) VALUES ('1', '姓名', 3);",
  39. // },
  40. // {
  41. // "key" : "202205011057",
  42. // "sql" : "INSERT INTO users (id, name, age) VALUES ('2', '姓名', 3);",
  43. // },
  44. {
  45. "key" : "202205050800",
  46. "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) );",
  47. },
  48. // {
  49. // "key" : "202205050801",
  50. // "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) );",
  51. // },
  52. // {
  53. // "key" : "202205050802",
  54. // "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) );",
  55. // },
  56. // {
  57. // "key" : "202205050803",
  58. // "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) );",
  59. // },
  60. {
  61. "key" : "202209030909",
  62. "sql" : "CREATE TABLE project(id varchar(255) PRIMARY KEY NOT NULL, del integer(11), time VARCHAR(255), name varchar(255), model_main varchar(255) );",
  63. },
  64. {
  65. "key" : "202307032139",
  66. "sql" : "CREATE TABLE name_only(id varchar(255) PRIMARY KEY NOT NULL, del integer(11), time VARCHAR(255), name varchar(255), type integer(11) );",
  67. },
  68. ];
  69. }
  70. /**
  71. * 单例模式的核心在于该方法
  72. * 单例模式的调用案例
  73. */
  74. static find() {
  75. // 当前对象不存在的时候
  76. if (this.thisObjModel == null) {
  77. // new 出自己本身对象
  78. this.thisObjModel = new this();
  79. }
  80. // 返回自己本身对象
  81. return this.thisObjModel;
  82. }
  83. /**
  84. * 开始同步数据
  85. */
  86. start() {
  87. this.migrateCreateBool(function(result) {
  88. MigrateSqllite.find().sqlStart(0, function(migrateSqlliteRes) {
  89. console.log("数据表同步数据完成");
  90. });
  91. });
  92. }
  93. /**
  94. * 判断 migrate 表是否存在
  95. * callback 成功返回后的回调方法,比如我执行完语句后,要返回的指定方法,例如 function (result) {}
  96. */
  97. migrateCreateBool(callback) {
  98. var sql = 'SELECT name FROM sqlite_master WHERE type="table"';
  99. // 因为操作数据库是异步的
  100. MySqllite.find().query(sql, 'all', function (err, result) {
  101. // 判断 migrate表是否存在
  102. var migrateTabelBool = false;
  103. if (result.length > 0) {
  104. for (var key in result) {
  105. if (result[key].name === 'migrate') {
  106. migrateTabelBool = true;
  107. }
  108. }
  109. }
  110. // 如果不存在
  111. if (migrateTabelBool === false) {
  112. // 创建表
  113. var createTable = 'CREATE TABLE migrate(name varchar(255), time VARCHAR(255));';
  114. MySqllite.find().query(createTable, null, function (err, result) {
  115. callback(result)
  116. });
  117. } else {
  118. callback("migrate 已经存在了")
  119. }
  120. });
  121. }
  122. /**
  123. * 开始执行sql语句
  124. * sum 当前执行的是第几个数组下标,当数组下标是最后一个,并且执行完成后,则改方法调用结束
  125. * callback 成功返回后的回调方法,比如我执行完语句后,要返回的指定方法,例如 function (result) {}
  126. */
  127. sqlStart(sum, callback) {
  128. if (this.sqlUpdate.length <= 0) {
  129. return callback("同步完成")
  130. }
  131. var thisSqlUpdate = this.sqlUpdate[sum];
  132. this.sqlMigrate(thisSqlUpdate, function(sqlMigrateErr, sqlMigrateRes) {
  133. console.log(sqlMigrateRes)
  134. if (sum >= (MigrateSqllite.find().sqlUpdate.length - 1)) {
  135. return callback("表结构同步完成")
  136. }
  137. return MigrateSqllite.find().sqlStart(sum +=1, callback)
  138. })
  139. }
  140. /**
  141. * 执行sql语句,更新到 migrate 里
  142. * thisSqlUpdate 当前执行的sql语句
  143. * callback 成功返回后的回调方法,比如我执行完语句后,要返回的指定方法,例如 function (err, result) {}
  144. */
  145. sqlMigrate(thisSqlUpdate, callback) {
  146. // 转换成你要的时间格式
  147. var date = modelsSillyDatetime.format(new Date(), 'YYYY-MM-DD HH:mm:ss');
  148. // 判断是否执行过记录了
  149. // 查询单条数据,只会返回一条数据
  150. // var sql = "SELECT * FROM users WHERE id = '38c7e90c-39d8-4c6b-bc70-a3d837f60c42';";
  151. var sql = "SELECT * FROM migrate WHERE name = '" + thisSqlUpdate['key'] + "';";
  152. // 因为操作数据库是异步的
  153. MySqllite.find().query(sql, 'get', function (err, result) {
  154. // 此时说明是不存在的
  155. if (result === undefined || result === null) {
  156. // 所以我们采用回调的方法,来实现同步
  157. MySqllite.find().query(thisSqlUpdate['sql'], null, function (err, result) {
  158. // 新增执行过的记录
  159. var sqlAddMigrate = "INSERT INTO migrate (name, time) VALUES ('" + thisSqlUpdate['key'] + "', '" + date + "');";
  160. MySqllite.find().query(sqlAddMigrate, null, function (err, result) {
  161. callback(null, "表结构同步 = " + thisSqlUpdate['key'] + " 执行完成")
  162. });
  163. });
  164. return true;
  165. }
  166. // 已经执行过了,则就不需要执行了
  167. callback(null, thisSqlUpdate['key'] + " 已经执行过了")
  168. });
  169. }
  170. }
  171. module.exports = MigrateSqllite;