20211207052900_sent_copy.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?php
  2. /*
  3. 迁移 sentence库
  4. 从旧数据表中提取数据插入到新的表
  5. 插入时用uuid判断是否曾经插入
  6. 曾经插入就不插入了
  7. */
  8. require_once __DIR__."/../../app/config.php";
  9. # 更新索引表
  10. $src_db=_SRC_DB_SENTENCE_;#源数据库
  11. $src_table=_TABLE_SRC_SENTENCE_BLOCK_;#源表名
  12. $dest_db=_FILE_DB_SENTENCE_;#目标数据库
  13. $dest_table=_TABLE_SENTENCE_BLOCK_;#目标表名
  14. fwrite(STDOUT,"migarate sent_block".PHP_EOL);
  15. #打开源数据库
  16. $PDO_SRC = new PDO($src_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
  17. $PDO_SRC->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
  18. fwrite(STDOUT,"open src table".PHP_EOL);
  19. #打开目标数据库
  20. $PDO_DEST = new PDO($dest_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
  21. $PDO_DEST->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
  22. fwrite(STDOUT,"open dest table".PHP_EOL);
  23. $queryInsert = "INSERT INTO ".$dest_table." (uid,
  24. parent_uid ,
  25. book_id,
  26. paragraph,
  27. owner_uid,
  28. lang,
  29. author,
  30. editor_uid,
  31. status,
  32. create_time,
  33. modify_time,
  34. created_at,
  35. updated_at)
  36. VALUES ( ? , ? , ? , ? ,? ,? ,? ,? ,? ,? ,?,to_timestamp(?),to_timestamp(?))";
  37. $commitData = [];
  38. $allInsertCount = 0;
  39. $allSrcCount = 0;
  40. $count = 0;
  41. #从源数据表中读取
  42. $query = "SELECT * FROM ".$src_table." WHERE true ";
  43. $stmtSrc = $PDO_SRC->prepare($query);
  44. $stmtSrc->execute();
  45. while($srcData = $stmtSrc->fetch(PDO::FETCH_ASSOC)){
  46. $allSrcCount++;
  47. #插入目标表
  48. if(substr($srcData["book"],0,1)==="p"){
  49. $srcData["book"] = (int)substr($srcData["book"],1);
  50. }
  51. if(strlen($srcData["id"])>10 && strlen($srcData["owner"])>30){
  52. $uuid = strtolower(trim($srcData["id"],"{}"));
  53. #查询目标表中是否有相同数据
  54. $queryExsit = "SELECT id FROM ".$dest_table." WHERE uid = ? ";
  55. $getExist = $PDO_DEST->prepare($queryExsit);
  56. $getExist->execute(array($uuid));
  57. $exist = $getExist->fetch(PDO::FETCH_ASSOC);
  58. if(!$exist){
  59. #没有相同数据
  60. if(strlen($srcData["editor"])>36){
  61. fwrite(STDERR,"error: {$uuid} editor {$srcData["editor"]} is too long".PHP_EOL);
  62. continue;
  63. }
  64. $commitData[] = array(
  65. $uuid,
  66. trim($srcData["parent_id"],"{}"),
  67. (int)$srcData["book"],
  68. (int)$srcData["paragraph"],
  69. strtolower(trim($srcData["owner"],"{}")),
  70. $srcData["lang"],
  71. $srcData["author"],
  72. $srcData["editor"],
  73. (int)$srcData["status"],
  74. $srcData["modify_time"],
  75. $srcData["modify_time"],
  76. $srcData["modify_time"]/1000,
  77. $srcData["modify_time"]/1000
  78. );
  79. $count++;
  80. $allInsertCount++;
  81. }
  82. if($count ==10000){
  83. #10000行插入一次
  84. // 开始一个事务,关闭自动提交
  85. $PDO_DEST->beginTransaction();
  86. $stmtDEST = $PDO_DEST->prepare($queryInsert);
  87. foreach ($commitData as $key => $value) {
  88. $stmtDEST->execute($value);
  89. if (!$stmtDEST || ($stmtDEST && $stmtDEST->errorCode() != 0)) {
  90. $error = $PDO_DEST->errorInfo();
  91. echo "error - $error[2] ";
  92. exit;
  93. }
  94. }
  95. // 提交更改
  96. $PDO_DEST->commit();
  97. $commitData = [];
  98. echo "finished $count".PHP_EOL;
  99. $count=0;
  100. }
  101. }
  102. }
  103. if($count>0){
  104. #最后的没有到10000的数据插入
  105. $PDO_DEST->beginTransaction();
  106. $stmtDEST = $PDO_DEST->prepare($queryInsert);
  107. foreach ($commitData as $key => $value) {
  108. $stmtDEST->execute($value);
  109. if (!$stmtDEST || ($stmtDEST && $stmtDEST->errorCode() != 0)) {
  110. $error = $PDO_DEST->errorInfo();
  111. echo "error - $error[2] ";
  112. exit;
  113. }
  114. }
  115. // 提交更改
  116. $PDO_DEST->commit();
  117. $commitData = [];
  118. echo "finished $count".PHP_EOL;
  119. }
  120. echo "insert done $allInsertCount in $allSrcCount ".PHP_EOL;
  121. # 更新数据表
  122. $src_db=_SRC_DB_USER_WBW_;#源数据库
  123. $src_table=_TABLE_SRC_SENTENCE_;#源表名
  124. $dest_db=_FILE_DB_USER_WBW_;#目标数据库
  125. $dest_table=_TABLE_SENTENCE_;#目标表名
  126. echo "migarating wbw".PHP_EOL;
  127. // 开始一个事务,关闭自动提交
  128. $queryInsert = "INSERT INTO ".$dest_table." (
  129. uid,
  130. parent_uid,
  131. block_uid ,
  132. channel_uid,
  133. book_id,
  134. paragraph,
  135. word_start,
  136. word_end,
  137. author,
  138. editor_uid,
  139. content,
  140. language,
  141. version,
  142. status,
  143. strlen,
  144. create_time,
  145. modify_time,
  146. created_at,
  147. updated_at) VALUES ( ? , ? , ? , ? ,? ,? ,? ,? ,? ,? ,?,?,?,?,?,?,?,to_timestamp(?),to_timestamp(?))";
  148. $commitData = [];
  149. $allInsertCount = 0;
  150. $allSrcCount = 0;
  151. $count = 0;
  152. #从源数据表中读取
  153. $query = "SELECT * FROM ".$src_table." WHERE true ";
  154. $stmtSrc = $PDO_SRC->prepare($query);
  155. $stmtSrc->execute();
  156. while($srcData = $stmtSrc->fetch(PDO::FETCH_ASSOC)){
  157. $allSrcCount++;
  158. #插入目标表
  159. $uuid = strtolower(trim($srcData["id"],"{}"));
  160. #查询目标表中是否有相同数据
  161. $queryExsit = "SELECT id FROM ".$dest_table." WHERE uid = ? ";
  162. $getExist = $PDO_DEST->prepare($queryExsit);
  163. $getExist->execute(array($uuid));
  164. $exist = $getExist->fetch(PDO::FETCH_ASSOC);
  165. if(!$exist){
  166. if(strlen($srcData["editor"])>36){
  167. fwrite(STDERR,"error: {$uuid} editor {$srcData["editor"]} too long".PHP_EOL);
  168. continue;
  169. }
  170. $commitData[] = array(
  171. $uuid,
  172. $srcData["parent"],
  173. $srcData["block_id"],
  174. $srcData["channal"],
  175. (int)$srcData["book"],
  176. (int)$srcData["paragraph"],
  177. (int)$srcData["begin"],
  178. (int)$srcData["end"],
  179. $srcData["author"],
  180. $srcData["editor"],
  181. $srcData["text"],
  182. $srcData["language"],
  183. (int)$srcData["ver"],
  184. (int)$srcData["status"],
  185. (int)$srcData["strlen"],
  186. $srcData["create_time"],
  187. $srcData["modify_time"],
  188. $srcData["create_time"]/1000,
  189. $srcData["modify_time"]/1000
  190. );
  191. $count++;
  192. $allInsertCount++;
  193. if($count === 10000){
  194. $PDO_DEST->beginTransaction();
  195. $stmtDEST = $PDO_DEST->prepare($queryInsert);
  196. foreach ($commitData as $key => $value) {
  197. # code...
  198. $stmtDEST->execute($value);
  199. if (!$stmtDEST || ($stmtDEST && $stmtDEST->errorCode() != 0)) {
  200. $error = $PDO_DEST->errorInfo();
  201. echo "error - $error[2] ";
  202. exit;
  203. }
  204. }
  205. // 提交更改
  206. $PDO_DEST->commit();
  207. echo "finished $count".PHP_EOL;
  208. $count = 0;
  209. }
  210. }
  211. if($allSrcCount % 10000 ==0){
  212. echo "find from src table $allSrcCount / $allInsertCount is new.".PHP_EOL;
  213. }
  214. }
  215. if($count>0){
  216. #最后的没有到10000的数据插入
  217. $PDO_DEST->beginTransaction();
  218. $stmtDEST = $PDO_DEST->prepare($queryInsert);
  219. foreach ($commitData as $key => $value) {
  220. # code...
  221. $stmtDEST->execute($value);
  222. if (!$stmtDEST || ($stmtDEST && $stmtDEST->errorCode() != 0)) {
  223. $error = $PDO_DEST->errorInfo();
  224. echo "error - $error[2] ";
  225. exit;
  226. }
  227. }
  228. // 提交更改
  229. $PDO_DEST->commit();
  230. echo "finished $count".PHP_EOL;
  231. }
  232. echo "insert done $allInsertCount in $allSrcCount ".PHP_EOL;
  233. echo "all done".PHP_EOL;