Yii2.0中不同业务之间的表导入工作(批量查询, 批量插入)
2016-09-06 11:08
621 查看
感想:
我已经做过好几次数据表之间的导入啊,同步啊什么的,数据不是太多,但也不能全部取出,这样速度会很慢的,所以就采用了,批量查询,然后再批量插入操作,现在,我总结下,以备以后进行使用。
1: //查询数据对象
$query = $this->swapObj($day, $startTime);
2: 首先批量查询 100条数据
说明:
1): 100: 表示批量取出100条数据
2): Yii::$app->crmDb 数据库地址配置(例如下面是本地配置)
5): 要说的是批量插入
总结: 以上就是我用到的知识点,其中包括:
1: 如何获取对应的$query对象
2: 批量查询数据
3: 对于批量查询的数据,再进行每条数据分别处理
4: 批量插入操作
5: 其他的就是业务逻辑了
虽然这些看似简单,但也算是知识点吧,对于一个健忘的我,还是有帮助的,加油吧!
我已经做过好几次数据表之间的导入啊,同步啊什么的,数据不是太多,但也不能全部取出,这样速度会很慢的,所以就采用了,批量查询,然后再批量插入操作,现在,我总结下,以备以后进行使用。
1: //查询数据对象
$query = $this->swapObj($day, $startTime);
/** * 处理牛转用户信息 * * @param string $startTime 开始时间 默认false * @return object|null */ public function swapObj($day, $startTime) { $query = WxUser::find() ->select('user_mobile, user_fullname, user_email, user_wechat, user_company, created_at, updated_at, user_position, user_country, user_province, user_city, user_area') ->where(['>', 'user_swap_register_step', 1]); //如果day存在,并且为“yesterday”, 说明要统计当前时间的前一天 if ($day && ($day == 'yesterday')) { $timeData = $this->handleTime(); if (isset($timeData['sTime'], $timeData['eTime']) && $timeData['sTime'] && $timeData['eTime']) { $query->andFilterWhere(['between', 'created_at', $timeData['sTime'], $timeData['eTime']]); } } //取出相应条件的数据,并返回 if ($startTime) { $query->andWhere(['>', 'created_at', $startTime]); } $query->groupBy("user_mobile")->asArray(); return $query ? $query : null; }
2: 首先批量查询 100条数据
foreach ($query->batch(100, Yii::$app->crmDb) as $rows) { if (!$rows || !is_array($rows)) { echo $this->stdout("无数据信息!\n", Console::BOLD);die; } //遍历每一组数据,进行拆分各个字段,进行组合 foreach ($rows as $key => $value) { //处理需要导出的数据 $mobile = $value['user_mobile']; $wechat = isset($value['user_wechat']) && $value['user_wechat'] ? $value['user_wechat'] : ''; $fullname = isset($value['user_fullname']) && $value['user_fullname'] ? $value['user_fullname'] : ''; ......... $data[] = [$mobile, $wechat, $fullname, $email, $company, $position, $region, $from, $createdAt, $updatedAt, $industry]; //批量插入操作 $keys = ['mobile', 'weixin', 'username', 'email', 'company', 'position', 'area', 'come_from', 'created_at', 'updated_at', 'trade']; $mUserSummary = new UserSummary(); $result = $mUserSummary->batchinsertInfo($keys, $data); unset($data); } }
说明:
1): 100: 表示批量取出100条数据
2): Yii::$app->crmDb 数据库地址配置(例如下面是本地配置)
'wxDb' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=wx_chuangyejia.com', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'tablePrefix' => 'wx_', ],3): 得到的rows是你要查询的前100条数据的数组集合
array(100) { [0]=> array(12) { ["user_mobile"]=> string(11) "xxxx" ["user_fullname"]=> string(16) "微信5000好友" ..... } [1]=> array(12) { ["user_mobile"]=> string(11) "xxxxx" ["user_fullname"]=> string(6) "李俊" ["user_email"]=> ...... } .... }4) : $rows遍历后得到的$value, 我们就可以对每组数据中的变量进行处理了
5): 要说的是批量插入
/** * 批量插入 * * @param string $keys 要插入的字段属性集合 * @param array $data 要插入的字段值数组数据 * @return int|bool */ public function batchinsertInfo($keys, $data) { $result = 0; if ($keys && $data && is_array($data)) { $result = self::find() ->createCommand() ->batchInsert(self::tableName(),$keys,$data) ->execute(); } return $result ? $result : 0; }
示例如下:
// INSERT 一次插入多行 $connection->createCommand() ->batchInsert('user', ['name', 'age'], //插入数据的字段名称 [['Tom', 30],['Jane', 20],['Linda', 25].... ]) //要插入多行的数据 ->execute();
总结: 以上就是我用到的知识点,其中包括:
1: 如何获取对应的$query对象
2: 批量查询数据
3: 对于批量查询的数据,再进行每条数据分别处理
4: 批量插入操作
5: 其他的就是业务逻辑了
虽然这些看似简单,但也算是知识点吧,对于一个健忘的我,还是有帮助的,加油吧!
相关文章推荐
- mysql针对查询结果,批量插入不同的uuid
- Sql 不同服务器之间查询表与插入表结构
- 【ITOO 1】SQLBulkCopy实现不同数据库服务器之间的批量导入
- 【ITOO 1】SQLBulkCopy实现不同数据库服务器之间的批量导入
- 不同数据库之间导入导出功能介绍
- 自动定时查询销售,定时保存成XLS,自动发送给不同的业务代表-----第四步
- 主流数据库之间对SQL:2003标准的不同实现方法比较(第三部分 前n项(Top-n)查询)
- 批量查询事务码与程序之间的映射关系,并可直接运行事务或修改程序
- 关于不同窗体之间的控件查询 - 方式二(事件与回调)
- 自动定时查询销售,定时保存成XLS,自动发送给不同的业务代表-----第0步
- 两个不同数据库之间的两个表如何关联起来查询数据
- [导入]批量插入数据的存储过程
- expdp/impdp如何实现不同用户之间的导出导入
- 两种不同编码规则("Chinese_PRC_BIN" 和 "Chinese_PRC_CI_AS")的表之间的数据查询,如
- 不同数据源之间的LINQ查询
- orcale不同版本数据导入、导出及库版本查询
- [导入]批量插入数据的存储过程
- 使用OPENDATASOURCE和OPENROWSET在不同类型的数据库之间导入导出数据
- 自动定时查询销售,定时保存成XLS,自动发送给不同的业务代表-----第一步
- ORACLE 批量插入 主键为自增序列 有几个字段数据从其他表导入的 有几个是固定的