def update_items(self, tab_item, items_data, update_keys=()): """ @summary: --------- @param tab_item: redis中items的表名 @param items_data: [item.to_dict] 数据 @param update_keys: 更新的字段 --------- @result: """ to_table = tools.get_info(tab_item, ":s_(.*?)_item", fetch_one=True) sql, datas = tools.make_batch_sql( to_table, items_data, update_columns=update_keys or list(items_data[0].keys()), ) update_count = self.to_db.add_batch(sql, datas) if update_count is None: log.error("更新表 %s 数据失败" % (to_table)) else: msg = "共更新 %s 条数据 到 %s" % (update_count // 2, to_table) if update_keys: msg += " 更新字段为 {}".format(update_keys) log.info(msg) return update_count != None
def update_items(self, table, items: List[Dict], update_keys=Tuple) -> bool: """ 更新数据 Args: table: 表名 items: 数据,[{},{},...] update_keys: 更新的字段, 如 ("title", "publish_time") Returns: 是否更新成功 True / False 若False,不会将本批数据入到去重库,以便再次入库 """ sql, datas = tools.make_batch_sql(table, items, update_columns=update_keys or list(items[0].keys())) update_count = self.to_db.add_batch(sql, datas) if update_count is None: log.error("更新表 %s 数据失败" % (table)) else: msg = "共更新 %s 条数据 到 %s" % (update_count // 2, table) if update_keys: msg += " 更新字段为 {}".format(update_keys) log.info(msg) return update_count != None
def add_batch_smart(self, table, datas: List[Dict], **kwargs): """ 批量添加数据, 直接传递list格式的数据,不用拼sql Args: table: 表名 datas: 列表 [[..], [...]] **kwargs: Returns: 添加行数 """ sql, datas = make_batch_sql(table, datas, **kwargs) return self.add_batch(sql, datas)
def save_items(self, table, items: List[Dict]) -> bool: """ 保存数据 Args: table: 表名 items: 数据,[{},{},...] Returns: 是否保存成功 True / False 若False,不会将本批数据入到去重库,以便再次入库 """ sql, datas = tools.make_batch_sql(table, items) add_count = self.to_db.add_batch(sql, datas) datas_size = len(datas) if add_count: log.info("共导出 %s 条数据 到 %s, 重复 %s 条" % (datas_size, table, datas_size - add_count)) return add_count != None
def export_items(self, tab_item, items_data): """ @summary: --------- @param tab_item: redis中items的表名 @param items_data: [item.to_dict] 数据 --------- @result: """ to_table = tools.get_info(tab_item, ":s_(.*?)_item", fetch_one=True) sql, datas = tools.make_batch_sql(to_table, items_data) add_count = self.to_db.add_batch(sql, datas) datas_size = len(datas) if add_count is None: log.error("导出数据到表 %s 失败" % (to_table)) else: log.info("共导出 %s 条数据 到 %s, 重复 %s 条" % (datas_size, to_table, datas_size - add_count)) return add_count != None
def export(self, from_table, to_table, auto_update=False, batch_count=100): """ @summary: 用于从redis的item中导出数据到关系型数据库,如mysql/oracle from_table与to_table表结构必须一致 --------- @param from_table: @param to_table: @param auto_update: 当数据存在时是否自动更新 默认否 --------- @result: """ total_count = 0 while True: datas = [] try: datas = self.redisdb.sget(from_table, count=batch_count, is_pop=False) if not datas: log.info(""" \r%s -> %s 共导出 %s 条数据""" % (from_table, to_table, total_count)) break json_datas = [eval(data) for data in datas] sql, json_datas = tools.make_batch_sql(to_table, json_datas, auto_update) if self.to_db.add_batch(sql, json_datas): total_count += len(json_datas) self.redisdb.srem(from_table, datas) except Exception as e: log.exception(e) log.error(datas)
def add_batch2(self, table, datas, **kwargs): sql, datas = make_batch_sql(table, datas, **kwargs) return self.add_batch(sql, datas)