mongo数据多进程导入mysql数据库(YII2实现)

<?php
/**
 * Created by PhpStorm.
 * User: huanghe
 * Date: 2016/2/29
 * Time: 14:24
 */

namespace console\controllers;
use yii\console\Controller;
use Yii;
use yii\mongodb\Query;

/**
 * command controller
 */
class ToolsController extends Controller {

    /*
     * mongo数据导入mysql
     * php G:/wamp/www/office/yii tools/mongo-to-mysql mall 1
     * php G:/wamp/www/office/yii tools/mongo-to-mysql mall 2
     * php G:/wamp/www/office/yii tools/mongo-to-mysql mall 3
     * php G:/wamp/www/office/yii tools/mongo-to-mysql mall 4
     * php G:/wamp/www/office/yii tools/mongo-to-mysql mall 5
     * php G:/wamp/www/office/yii tools/mongo-to-mysql mall 6
     * php G:/wamp/www/office/yii tools/mongo-to-mysql analytics
     */
    public function actionMongoToMysql($dbName, $mongoTablesImport=0)
    {
        if($dbName == ‘mall‘){
            $malldb = Yii::$app->get(‘malldb‘);
            if($mongoTablesImport == 1){
                $mongoTables = [
                    ‘goods‘,
                    ‘goods_analysis‘,
                    ‘goods_attribute‘,
                    ‘goods_class‘,
                    ‘goods_class_ad‘,
                    ‘goods_class_ad_list‘,
                    ‘goods_combination‘,
                    ‘goods_comment‘,
                    ‘goods_group_list‘,
                    ‘goods_group_sub‘,
                    ‘goods_local_price‘,
                    ‘goods_package‘,
                    ‘goods_picture‘,
                    ‘goods_province_price‘,
                    ‘goods_type‘,
                    ‘mall‘,
                    ‘notice‘,
                    ‘notice_list‘,
                    ‘order‘,
                    ‘order_goods‘,
                    ‘payment‘,
                    ‘receiving‘,
                    ‘reduction‘,
                    ‘relation‘,
                    ‘voucher‘,
                ];
            }else if($mongoTablesImport == 2){
                $mongoTables = [
                    ‘order_record‘,
                    ‘ordergoods‘,
                    ‘order_goods_record‘,
                    ‘ordergoodsrecord‘,
                    ‘voucher_list_record‘,
                ];
            }else if(in_array($mongoTablesImport, [3,4,5,6])){
                $mongoTables = [
                    ‘voucher_list‘,
                ];
            }else if($mongoTablesImport == 7){
                $mongoTables = [
                    ‘stock‘,
                ];
            }else{
                die(‘mongoTablesImport error‘);
            }
        }else if($dbName == ‘analytics‘){
            $malldb = Yii::$app->get(‘analyticsdb‘);
            $mongoTables = [
                ‘goods_comment‘,
                ‘goods_sales‘,
                ‘goods_sales_day‘,
            ];
        }else{
            die(‘dbName error‘);
        }
        foreach($mongoTables as $mongoTable){
            if(($dbName == ‘analytics‘) || in_array($mongoTable, [‘ordergoods‘, ‘ordergoodsrecord‘])){
                $mongoTableName = $mongoTable;
            }else{
                $mongoTableName = $dbName.‘.‘.$mongoTable;
            }
            $mysqlTableName = $dbName.‘_‘.$mongoTable;
            echo $mysqlTableName.‘ process is beginning.‘.PHP_EOL;
            $start = 0;
            $len = 100;
            $query = new Query;
            if($mongoTablesImport == 3){
                //$total = $query->from($mongoTableName)->where([‘in‘, ‘state‘, [‘2‘, ‘3‘]])->count(‘*‘, $malldb);echo $total;exit;
                $list = $query->from($mongoTableName)->where([‘in‘, ‘state‘, [‘2‘, ‘3‘]])->offset($start)->limit($len)->all($malldb);
            }else if($mongoTablesImport == 4){
                //$total = $query->from($mongoTableName)->where([‘state‘ => ‘1‘])->andWhere([‘voucher_id‘ =>new \MongoId(‘564adcff08bd711d7d50c1e5‘)])->count(‘*‘, $malldb);echo $total;exit;
                $list = $query->from($mongoTableName)->where([‘state‘ => ‘1‘])->andWhere([‘voucher_id‘ => new \MongoId(‘564adcff08bd711d7d50c1e5‘)])->offset($start)->limit($len)->all($malldb);
            }else if($mongoTablesImport == 5){
                $list = $query->from($mongoTableName)->where([‘state‘ => ‘1‘])->andWhere([‘voucher_id‘ => new \MongoId(‘55e18fa408bd71072c8c017e‘)])->offset($start)->limit($len)->all($malldb);
            }else if($mongoTablesImport == 6){
                $voucherMongoIdArr = [
                    new \MongoId(‘56d94b94ed9b245bf517aa21‘),
                    new \MongoId(‘55f68bf708bd7144be9467f5‘),
                    new \MongoId(‘55fa80c208bd7144c0948f0c‘),
                    new \MongoId(‘55de7fc808bd717342242ac4‘),
                    new \MongoId(‘55de7f4908bd71734223fbe3‘),
                    new \MongoId(‘5695c3d3ed9b2464dbc52908‘),
                    new \MongoId(‘56c5a533ed9b247c5d352649‘),
                    new \MongoId(‘56c6ca7fed9b247c5d352a43‘)];
                $list = $query->from($mongoTableName)->where([‘state‘ => ‘1‘])->andWhere([‘in‘, ‘voucher_id‘, $voucherMongoIdArr])->offset($start)->limit($len)->all($malldb);
            }else{
                $list = $query->from($mongoTableName)->offset($start)->limit($len)->all($malldb);
            }
            while(!empty($list) && is_array($list)) {
                foreach ($list as $each) {
                   // \common\widgets\Tools::P($each);exit;
                    $mysqlData = [];
                    foreach($each as $mongoKey=>$mongoVal){
                        if($mongoKey == ‘_id‘){
                            $mongoKey = ‘mongo_id‘;
                        }
                        if(is_object($mongoVal) && get_class($mongoVal)==‘MongoDate‘){
                            $mongoVal = $mongoVal->toDateTime()->format(‘Y-m-d H:i:s‘);
                        }
                        if(is_array($mongoVal)){
                            $mongoVal = json_encode($mongoVal);
                        }
                        $mongoVal = (string)$mongoVal;
                        if($mongoVal === ‘‘){
                            continue;
                        }
                        if(($mongoTableName == $dbName.‘.payment‘) && ($mongoKey == ‘notify_time‘)){
//                            if(!preg_match("/^d{4}-d{2}-d{2} d{2}:d{2}:d{2}$/s",$mongoVal)) {
//                                continue;
//                            }
                            if($mongoVal == ‘-- ::‘){
                                continue;
                            }
                        }
                        if(($mongoTableName == $dbName.‘.receiving‘) && ($mongoKey == ‘Fixed‘)){
                            $mongoKey = ‘fix_phone‘;
                        }
                        $mysqlData[$mongoKey] = $mongoVal;
                    }
                    //\common\widgets\Tools::P($mysqlData);exit;
                    $mysqldb = $dbName.‘Mysql‘;
                    $exist = Yii::$app->$mysqldb->createCommand(‘SELECT mongo_id FROM ‘.$mysqlTableName.‘ WHERE mongo_id="‘.$mysqlData[‘mongo_id‘].‘"‘)->queryOne();
                    try {
                        if(empty($exist)){
                            Yii::$app->$mysqldb->createCommand()->insert($mysqlTableName, $mysqlData)->execute();
                        }else{
                            Yii::$app->$mysqldb->createCommand()->update($mysqlTableName, $mysqlData, ‘mongo_id="‘.$mysqlData[‘mongo_id‘].‘"‘)->execute();
                        }
                    } catch (Exception $e) {
                        echo $e->getCode().‘|‘.$e->getMessage().PHP_EOL;
                        exit();
                    }
                    echo (++$start).‘ ‘.$mysqlTableName." data already process ok...".PHP_EOL;
                }
                $list = $query->from($mongoTableName)->offset($start)->limit($len)->all($malldb);
            }
            echo $mysqlTableName.‘ process is over.‘.PHP_EOL;
        }
    }

}
时间: 2024-08-27 01:40:47

mongo数据多进程导入mysql数据库(YII2实现)的相关文章

Python将JSON格式数据转换为SQL语句以便导入MySQL数据库

前文中我们把网络爬虫爬取的数据保存为JSON格式,但为了能够更方便地处理数据,我们希望把这些数据导入到MySQL数据库中.phpMyadmin可以把MySQL数据库中的数据导出为JSON格式文件,但却不能把JSON格式文件导入到MySQL数据库.为了实现这个目标,可以编写Python脚本将JSON格式数据转换为SQL语句以便导入MySQL数据库. JSON文件tencent.json部分内容: {"recruitNumber": "1", "name&qu

【MySQL笔记】Excel数据导入Mysql数据库的实现方法——Navicat

很多公司尤其有点年头的公司,财务业务部门的各种表单都是excel来做的表格,随着互联网的发展各种业务流程都电子化流程化了,再在茫茫多的文档中去查找某一个年份月份的报告是件相当枯燥的事,所以都在想办法将以前的数据直接导入现代智能化的办公程序道中,在这里可能很多初级程序员都会有些挠头不知所措,下面来介绍下我的小经验,希望能为大家提供便利! 工具/原料 首先做一下说明,为什么我要用Navicat,第一个原因,因为它是个不错的Mysql GUI工具,更重要的是,它可以将一些外部数据源导入Mysql数据库

将Excel数据导入mysql数据库的几种方法

将Excel数据导入mysql数据库的几种方法 “我的面试感悟”有奖征文大赛结果揭晓! 前几天需要将Excel表格中的数据导入到mysql数据库中,在网上查了半天,研究了半天,总结出以下几种方法,下面和大家分享一下: 一.用java来将Excel表格中的数据转到mysql中 这是我们用的第一种方法,就是在java找你感谢个类,然后这个类会将Excel表格中的数据存储到内存里,然后再从内存中读出来插入到数据库中,但是要 注意了,这里是存储到String[ ]数组里面,所以取出来的数据也是Strin

将csv格式数据导入MySql数据库

 将csv文件或者excel表格导入数据库的方法: Excel数据直接导入mysql会需要用到phpexcel开源类,详情使用可以参考这篇文章~ http://www.cnblogs.com/freespider/p/3284828.html 本文使用的方法是: Excel --> CSV-->MySql 首先将excel另存为csv文件,然后开始分析数据. 代码如下: <span style="font-size:18px;"><?PHP //将csv文

衡阳高防服务器租用-数据从sqlserver导入mysql数据库的体验

衡阳高防服务器租用-数据从sqlserver导入mysql数据库的体验 第一种是安装mysql ODBC,利用sql server的导出功能,选择mysql数据源,进行数据的直接导出,这种方法很简便,但是针对实际应用有很多弊端,最主要体现就是数据类型问题,首先,sql server数据库中的ntext,image等数据类型的数据无法直接写入到mysql数据库中,据说只要稍加改动就可以,可惜偶这只菜鸟还没想到如何改动,其次,因为偶在mysql中的数据库设计中将时间都设成int型(保存的是时间戳),

Shell_mysql命令以及将数据导入Mysql数据库

连接MYSQL数据库 mysql -h${db_ip} -u${db_user} -p${db_pawd} -P${db_port} -D${db_name} -s -e "${sql}" db_ip:主机地址 db_user :数据库用户名 db_pwd:密码 db_port:端口号 db_name:数据库名称 sql:执行语句[增删查改] 将数据导入MYSQL数据库 load data [local] in file '${data_source}' into table ${ta

PowerDesigner逆向工程导入MYSQL数据库总结

由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 1.????? 安装MYSQL的ODBC驱动 Connector/ODBC 5.1.10 下载地址:http://dev.mysql.com/downloads/connector/odbc/5.1.html 对了,在这里我要强调的是如果 你系统是window7 ,64位应该下载64位的,我之前试过了,装32位不行,呵呵 点击后就跳转到这个页面,我这个谷歌浏览器自动翻译中文,其他浏览

Atitit.软件GUIbutton与仪表盘--db数据库区--导入mysql sql错误的解决之道

Atitit.软件GUIbutton与仪表盘--db数据库区--导入mysql sql错误的解决之道 Keyword::截取文本文件后部分 查看提示max_allowed_packet限制 Target Server Version : 50524 3.mysql的max_allowed_packet限制[phpmyadmin | source] Show vari like '%%' Set max..=111111 Set global maxxx=1111 作者::老哇的爪子Attilax

使用命令行将Excel数据表导入Mysql中的方法小结

从Excel数据表导入MySQL,已经做过好几次了,但每次都会碰到各种问题:invalid utf8 character string, data too long, ...,浪费了不少时间 为了提高效率,是时候指定一个数据导入的SOP了: 1.准备.txt文件 1.1 将要导入的数据(不含表头)从工作表复制.粘贴到一个新建的Excel数据表中(避免污染源数据) 1.2 粘贴时注意:使用右键paste as value选项,过滤掉源数据表中的多余格式(如,字体颜色.粗体等) 1.3 将新建的Ex