20211207164600_sent_pr_copy.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. /*
  3. 迁移 sentence pr 库
  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_PR_;#源表名
  12. $dest_db=_FILE_DB_SENTENCE_;#目标数据库
  13. $dest_table=_TABLE_SENTENCE_PR_;#目标表名
  14. fwrite(STDOUT,"migarate sent_pr".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."
  24. (
  25. id,
  26. book_id,
  27. paragraph,
  28. word_start,
  29. word_end,
  30. channel_uid,
  31. author,
  32. editor_uid,
  33. content,
  34. language,
  35. status,
  36. strlen,
  37. create_time,
  38. modify_time,
  39. created_at,
  40. updated_at)
  41. VALUES ( ? , ? , ? , ? ,? ,? ,? ,? ,? ,? ,?,?,?,?,to_timestamp(?),to_timestamp(?))";
  42. $commitData = [];
  43. $allInsertCount = 0;
  44. $allSrcCount = 0;
  45. $count = 0;
  46. #从源数据表中读取
  47. $query = "SELECT * FROM ".$src_table." WHERE true ";
  48. $stmtSrc = $PDO_SRC->prepare($query);
  49. $stmtSrc->execute();
  50. while($srcData = $stmtSrc->fetch(PDO::FETCH_ASSOC)){
  51. $allSrcCount++;
  52. #插入目标表
  53. if(substr($srcData["book"],0,1)==="p"){
  54. $srcData["book"] = (int)substr($srcData["book"],1);
  55. }
  56. {
  57. $uuid = $srcData["id"];
  58. #查询目标表中是否有相同数据
  59. $queryExsit = "SELECT id FROM ".$dest_table." WHERE id = ? ";
  60. $getExist = $PDO_DEST->prepare($queryExsit);
  61. $getExist->execute(array($uuid));
  62. $exist = $getExist->fetch(PDO::FETCH_ASSOC);
  63. if(!$exist){
  64. #没有相同数据
  65. if(strlen($srcData["editor"])>36){
  66. fwrite(STDERR,"error: {$uuid} editor {$srcData["editor"]} is too long".PHP_EOL);
  67. continue;
  68. }
  69. $commitData[] = array(
  70. $uuid,
  71. (int)$srcData["book"],
  72. (int)$srcData["paragraph"],
  73. (int)$srcData["begin"],
  74. (int)$srcData["end"],
  75. $srcData["channel"],
  76. $srcData["author"],
  77. $srcData["editor"],
  78. $srcData["text"],
  79. $srcData["language"],
  80. (int)$srcData["status"],
  81. (int)$srcData["strlen"],
  82. $srcData["create_time"],
  83. $srcData["modify_time"],
  84. $srcData["create_time"]/1000,
  85. $srcData["modify_time"]/1000
  86. );
  87. $count++;
  88. $allInsertCount++;
  89. }
  90. if($count ==10000){
  91. #10000行插入一次
  92. // 开始一个事务,关闭自动提交
  93. $PDO_DEST->beginTransaction();
  94. $stmtDEST = $PDO_DEST->prepare($queryInsert);
  95. foreach ($commitData as $key => $value) {
  96. $stmtDEST->execute($value);
  97. if (!$stmtDEST || ($stmtDEST && $stmtDEST->errorCode() != 0)) {
  98. $error = $PDO_DEST->errorInfo();
  99. echo "error - $error[2] ";
  100. exit;
  101. }
  102. }
  103. // 提交更改
  104. $PDO_DEST->commit();
  105. $commitData = [];
  106. echo "finished $count".PHP_EOL;
  107. $count=0;
  108. }
  109. }
  110. }
  111. if($count>0){
  112. #最后的没有到10000的数据插入
  113. $PDO_DEST->beginTransaction();
  114. $stmtDEST = $PDO_DEST->prepare($queryInsert);
  115. foreach ($commitData as $key => $value) {
  116. $stmtDEST->execute($value);
  117. if (!$stmtDEST || ($stmtDEST && $stmtDEST->errorCode() != 0)) {
  118. $error = $PDO_DEST->errorInfo();
  119. echo "error - $error[2] ";
  120. exit;
  121. }
  122. }
  123. // 提交更改
  124. $PDO_DEST->commit();
  125. $commitData = [];
  126. echo "finished $count".PHP_EOL;
  127. }
  128. echo "insert done $allInsertCount in $allSrcCount ".PHP_EOL;
  129. echo "all done".PHP_EOL;