2
0

20211204120600_wbw_blocks_copy.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. /*
  3. 从旧数据表中提取数据插入到新的表
  4. 插入时用uuid判断是否曾经插入
  5. 曾经插入就不插入了
  6. */
  7. // Require Composer's autoloader.
  8. require_once __DIR__.'/../../../public/vendor/autoload.php';
  9. require_once __DIR__."/../../../public/app/config.php";
  10. require_once __DIR__."/../../../public/app/public/snowflakeid.php";
  11. set_exception_handler(function($e){
  12. fwrite(STDERR,"error-msg:".$e->getMessage().PHP_EOL);
  13. fwrite(STDERR,"error-file:".$e->getFile().PHP_EOL);
  14. fwrite(STDERR,"error-line:".$e->getLine().PHP_EOL);
  15. exit;
  16. });
  17. # 更新索引表
  18. #user info
  19. $user_db=_FILE_DB_USERINFO_;#user数据库
  20. $user_table=_TABLE_USER_INFO_;#user表名
  21. $src_db=_SQLITE_DB_USER_WBW_;#源数据库
  22. $src_table=_SQLITE_TABLE_USER_WBW_BLOCK_;#源表名
  23. $dest_db=_PG_DB_USER_WBW_;#目标数据库
  24. $dest_table=_PG_TABLE_USER_WBW_BLOCK_;#目标表名
  25. # 雪花id
  26. $snowflake = new SnowFlakeId();
  27. fwrite(STDOUT, "migarate wbw_block".PHP_EOL);
  28. #打开user数据库
  29. $PDO_USER = new PDO($user_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
  30. $PDO_USER->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  31. fwrite(STDOUT,"open user table".PHP_EOL);
  32. #打开源数据库
  33. $PDO_SRC = new PDO($src_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
  34. $PDO_SRC->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  35. fwrite(STDOUT, "open src".PHP_EOL);
  36. #打开目标数据库
  37. $PDO_DEST = new PDO($dest_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
  38. $PDO_DEST->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  39. fwrite(STDOUT, "open dest".PHP_EOL);
  40. // 开始一个事务,关闭自动提交
  41. fwrite(STDOUT, "begin Transaction".PHP_EOL);
  42. $queryInsert = "INSERT INTO ".$dest_table."
  43. (
  44. id,
  45. uid,
  46. parent_id ,
  47. channel_uid,
  48. parent_channel_uid,
  49. creator_uid,
  50. editor_id,
  51. book_id,
  52. paragraph,
  53. style,
  54. lang,
  55. status,
  56. create_time,
  57. modify_time,
  58. created_at,
  59. updated_at
  60. )
  61. VALUES ( ? , ? , ? , ? , ? , ? ,? , ? , ? , ? , ? , ? , ? , ? , to_timestamp(?),to_timestamp(?))";
  62. $commitData = [];
  63. $allInsertCount = 0;
  64. $allSrcCount = 0;
  65. $count = 0;
  66. #从源数据表中读取
  67. $query = "SELECT * FROM ".$src_table." WHERE true ";
  68. $stmtSrc = $PDO_SRC->prepare($query);
  69. $stmtSrc->execute();
  70. #从user数据表中读取
  71. $query = "SELECT id ,userid FROM ".$user_table." WHERE userid = ? or username = ? ";
  72. $stmtUser = $PDO_USER->prepare($query);
  73. while($srcData = $stmtSrc->fetch(PDO::FETCH_ASSOC)){
  74. $allSrcCount++;
  75. if($srcData["owner"]=='test6'){
  76. $srcData["owner"] = 'f81c7140-64b4-4025-b58c-45a3b386324a';
  77. }
  78. if($srcData["owner"]=='test28'){
  79. $srcData["owner"] = 'df0ad9bc-c0cd-4cd9-af05-e43d23ed57f0';
  80. }
  81. if($srcData["owner"]=='290fd808-2f46-4b8c-b300-0367badd67ed'){
  82. $srcData["owner"] = 'f81c7140-64b4-4025-b58c-45a3b386324a';
  83. }
  84. if($srcData["owner"]=='BA837178-9ABD-4DD4-96A0-D2C21B756DC4'){
  85. $srcData["owner"] = 'ba5463f3-72d1-4410-858e-eadd10884713';
  86. }
  87. $stmtUser->execute(array($srcData["owner"],$srcData["owner"]));
  88. $userId = $stmtUser->fetch(PDO::FETCH_ASSOC);
  89. if(!$userId){
  90. fwrite(STDERR,"no user id {$srcData["owner"]}".PHP_EOL);
  91. continue;
  92. }
  93. #插入目标表
  94. if(empty($srcData["book"])){
  95. fwrite(STDERR,"book is null {$uuid}".PHP_EOL);
  96. continue;
  97. }
  98. if(substr($srcData["book"],0,1)==="p"){
  99. $srcData["book"] = substr($srcData["book"],1);
  100. }
  101. if(empty($srcData["paragraph"])){
  102. fwrite(STDERR,"paragraph is null {$uuid}".PHP_EOL);
  103. continue;
  104. }
  105. if(empty($srcData["parent_id"])){
  106. $srcData["parent_id"] = NULL;
  107. }
  108. if(empty($srcData["channal"])){
  109. $srcData["channal"] = NULL;
  110. }
  111. if(empty($srcData["status"])){
  112. $srcData["status"] = 10;
  113. }
  114. if(empty($srcData["create_time"]) || $srcData["create_time"]<1532590551000){
  115. $srcData["create_time"]=1532590551000;
  116. }
  117. if(empty($srcData["modify_time"]) || $srcData["modify_time"]<1532590551000){
  118. $srcData["modify_time"]=1532590551000;
  119. }
  120. $uuid = $srcData["id"];
  121. #查询目标表中是否有相同数据
  122. $queryExsit = "SELECT id FROM ".$dest_table." WHERE uid = ? ";
  123. $getExist = $PDO_DEST->prepare($queryExsit);
  124. $getExist->execute(array($uuid));
  125. $exist = $getExist->fetch(PDO::FETCH_ASSOC);
  126. if(!$exist){
  127. #没有相同数据
  128. if(strlen($srcData["parent_id"])>36){
  129. fwrite(STDERR, "parent_id too long ".$srcData["parent_id"].PHP_EOL);
  130. continue;
  131. }
  132. if(strlen($srcData["channal"])>36){
  133. fwrite(STDERR, "channal too long ".$srcData["channal"].PHP_EOL);
  134. continue;
  135. }
  136. if(strlen($srcData["parent_channel"])>36){
  137. fwrite(STDERR, "parent_channel too long ".$srcData["parent_channel"].PHP_EOL);
  138. continue;
  139. }
  140. if(strlen($srcData["owner"])>36){
  141. fwrite(STDERR, "owner too long ".$srcData["owner"].PHP_EOL);
  142. continue;
  143. }
  144. $commitData[] = array(
  145. $snowflake->id(),
  146. $uuid,
  147. $srcData["parent_id"],
  148. $srcData["channal"],
  149. $srcData["parent_channel"],
  150. $userId["userid"],
  151. $userId["id"],
  152. $srcData["book"],
  153. $srcData["paragraph"],
  154. $srcData["style"],
  155. $srcData["lang"],
  156. $srcData["status"],
  157. $srcData["create_time"],
  158. $srcData["modify_time"],
  159. $srcData["create_time"]/1000,
  160. $srcData["modify_time"]/1000
  161. );
  162. $count++;
  163. $allInsertCount++;
  164. }
  165. if($count ==10000){
  166. #10000行插入一次
  167. $PDO_DEST->beginTransaction();
  168. $stmtDEST = $PDO_DEST->prepare($queryInsert);
  169. foreach ($commitData as $key => $value) {
  170. $stmtDEST->execute($value);
  171. }
  172. // 提交更改
  173. $PDO_DEST->commit();
  174. $commitData = [];
  175. fwrite(STDOUT, "finished $count".PHP_EOL);
  176. $count=0;
  177. }
  178. }
  179. if($count>0){
  180. #最后的剩余的数据插入
  181. $PDO_DEST->beginTransaction();
  182. $stmtDEST = $PDO_DEST->prepare($queryInsert);
  183. foreach ($commitData as $key => $value) {
  184. $stmtDEST->execute($value);
  185. }
  186. // 提交更改
  187. $PDO_DEST->commit();
  188. $commitData = [];
  189. fwrite(STDOUT, "finished $count".PHP_EOL);
  190. }
  191. fwrite(STDOUT,"insert done $allInsertCount in $allSrcCount ".PHP_EOL);
  192. fwrite(STDOUT,"all done".PHP_EOL);