iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Python实现将MongoDB中的数据导入到MySQL
  • 181
分享到

Python实现将MongoDB中的数据导入到MySQL

摘要

本文主要介绍了一个将 mongoDB 中的数据导入到 Mysql 中的 python 工具类 MonGoTomysql。该工具类实现了获取 MongoDB 数据类型、创建 Mysql 表结构以及将数据从 MongoDB

本文主要介绍了一个将 mongoDB 中的数据导入到 Mysql 中的 python 工具类 MonGoTomysql。该工具类实现了获取 MongoDB 数据类型、创建 Mysql 表结构以及将数据从 MongoDB 推送到 MySQL 等功能。

通过该工具类,用户可以轻松地将 MongoDB 中的数据导入到 MySQL 中,实现数据的转移和使用。

使用该工具类,用户需要传入相应的参数,包括 MongoDB 的连接信息,MySQL 的连接信息,以及表名、是否设置最大长度、批处理大小和表描述等信息。具体使用可以参考代码中的注释。

实现代码

import pymysql
from loguru import logger

class MongoToMysql:
    def __init__(self, mongo_host, mongo_port, mongo_db, mongo_collection, mysql_host, mysql_port, mysql_user,
                 mysql_passWord, mysql_db,table_name=None,set_max_length=False,BATch_size=10000,table_description=''):
        self.mongo_host = mongo_host
        self.mongo_port = mongo_port
        self.mongo_db = mongo_db
        self.mongo_collection = mongo_collection
        self.mysql_host = mysql_host
        self.mysql_port = mysql_port
        self.mysql_user = mysql_user
        self.mysql_password = mysql_password
        self.mysql_db = mysql_db
        self.table_name = table_name
        self.set_max_length = set_max_length
        self.batch_size = batch_size
        self.table_description = table_description
        self.data_types = self.get_mongo_data_types()
        self.create_mysql_table(self.data_types,set_max_length= self.set_max_length,table_description=self.table_description)
        self.push_data_to_mysql(self.batch_size)

    def get_mongo_data_types(self):
        logger.debug('正在获取mongo中字段的类型!')
        client = pymongo.MongoClient(host=self.mongo_host, port=self.mongo_port)
        db = client[self.mongo_db]
        collection = db[self.mongo_collection]
        data_types = {}
        for field in collection.find_one().keys():
            data_types[field] = type(collection.find_one()[field]).__name__
        return data_types

    def check_mysql_table_exists(self):
        logger.debug('检查是否存在该表,有则删之!')
        conn = pymysql.connect(host=self.mysql_host, port=self.mysql_port, user=self.mysql_user,
                               password=self.mysql_password, db=self.mysql_db)
        cursor = conn.cursor()
        sql = f"DROP TABLE IF EXISTS {self.mongo_collection}"
        cursor.execute(sql)
        conn.commit()
        conn.close()

    def get_max_length(self, field):
        logger.debug(f'正在获取字段 {field} 最大长度......')
        client = pymongo.MongoClient(host=self.mongo_host, port=self.mongo_port)
        db = client[self.mongo_db]
        collection = db[self.mongo_collection]
        max_length = 0
        for item in collection.find({},{field:1,'_id':0}):
            value = item.get(field)
            if isinstance(value, str) and len(value) > max_length:
                max_length = len(value)
        return max_length

    def create_mysql_table(self, data_types,set_max_length,table_description):
        logger.debug('正在mysql中创建表结构!')
        self.check_mysql_table_exists()
        conn = pymysql.connect(host=self.mysql_host, port=self.mysql_port, user=self.mysql_user,
                               password=self.mysql_password, db=self.mysql_db)
        cursor = conn.cursor()
        if self.table_name:
            table_name = self.table_name
        else:
            table_name = self.mongo_collection
        fields = []
        for field, data_type in data_types.items():
            if data_type == 'int':
                fields.append(f"{field} INT")
            elif data_type == 'float':
                fields.append(f"{field} FLOAT")
            elif data_type == 'bool':
                fields.append(f"{field} BOOLEAN")
            else:
                if set_max_length:
                    fields.append(f"{field} TEXT)")
                else:
                    max_length = self.get_max_length(field)
                    fields.append(f"{field} VARCHAR({max_length + 200})")
        fields_str = ','.join(fields)
        sql = f"CREATE TABLE {table_name} (id INT PRIMARY KEY AUTO_INCREMENT,{fields_str}) COMMENT='{table_description}'"
        cursor.execute(sql)
        conn.commit()
        conn.close()


    def push_data_to_mysql(self, batch_size=10000):
        logger.debug('--- 正在准备从mongo中每次推送10000条数据到mysql ----')
        client = pymongo.MongoClient(host=self.mongo_host, port=self.mongo_port)
        db = client[self.mongo_db]
        collection = db[self.mongo_collection]
        conn = pymysql.connect(host=self.mysql_host, port=self.mysql_port, user=self.mysql_user,
                               password=self.mysql_password, db=self.mysql_db)
        cursor = conn.cursor()
        if self.table_name:
            table_name = self.table_name
        else:
            table_name = self.mongo_collection
        # table_name = self.mongo_collection
        data = []
        count = 0
        for item in collection.find():
            count += 1
            row = []
            for field, data_type in self.data_types.items():
                value = item.get(field)
                if value is None:
                    row.append(None)
                elif data_type == 'int':
                    row.append(str(item.get(field, 0)))
                elif data_type == 'float':
                    row.append(str(item.get(field, 0.0)))
                elif data_type == 'bool':
                    row.append(str(item.get(field, False)))
                else:
                    row.append(str(item.get(field, '')))
            data.append(row)
            if count % batch_size == 0:
                placeholders = ','.join(['%s'] * len(data[0]))
                sql = f"INSERT INTO {table_name} VALUES (NULL,{placeholders})"
                cursor.executemany(sql, data)
                conn.commit()
                data = []
                logger.debug(f'--- 已完成推送:{count} 条数据! ----')
        if data:
            placeholders = ','.join(['%s'] * len(data[0]))
            sql = f"INSERT INTO {table_name} VALUES (NULL,{placeholders})"
            cursor.executemany(sql, data)
            conn.commit()
            logger.debug(f'--- 已完成推送:{count} 条数据! ----')
        conn.close()


if __name__ == '__main__':
    """MySQL"""
    mongo_host = '127.0.0.1'
    mongo_port = 27017
    mongo_db = 'db_name'
    mongo_collection = 'collection_name'

    """MongoDB"""
    mysql_host = '127.0.0.1'
    mysql_port = 3306
    mysql_user = 'root'
    mysql_password = '123456'
    mysql_db = 'mysql_db'

    table_description = ''  # 表描述

    mongo_to_mysql = MongoToMysql(mongo_host, mongo_port, mongo_db, mongo_collection, mysql_host, mysql_port,
                                  mysql_user, mysql_password, mysql_db,table_description=table_description)


    #
    # table_name = None  # 默认为None 则MySQL中的表名跟Mongo保持一致
    # set_max_length = False # 默认为False 根据mongo中字段最大长度 加200 来设置字段的VARCHART长度 , 否则定义TEXT类型
    # batch_size = 10000   # 控制每次插入数据量的大小
    # table_description = '' # 表描述
    # mongo_to_mysql = MongoToMysql(mongo_host, mongo_port, mongo_db, mongo_collection, mysql_host, mysql_port,
    #                               mysql_user, mysql_password, mysql_db,table_name,set_max_length,batch_size,table_description)

代码使用了 PyMongo、PyMySQL 和 Loguru 等 Python 库,并封装了一个 MongoToMysql 类。在类的初始化时,会自动获取 MongoDB 中字段的类型,并根据字段类型创建 MySQL 表结构。在将数据从 MongoDB 推送到 MySQL 时,还可以控制每次插入数据量的大小,以避免一次性插入大量数据造成系统崩溃或性能下降。

需要注意的是,在创建 MySQL 表结构时,如果用户选择了设置最大长度,则会创建 TEXT 类型的字段,否则会根据 MongoDB 中字段的最大长度加上200来设置 VARCHAR 类型的字段长度。

总之,本文介绍的 MongoToMysql 工具类非常方便实用,对于需要将 MongoDB 数据迁移到 MySQL 的用户来说,是一种很好的解决方案。

到此这篇关于Python实现将MongoDB中的数据导入到MySQL的文章就介绍到这了,更多相关Python MongoDB数据导入到MySQL内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: Python实现将MongoDB中的数据导入到MySQL

本文链接: https://www.lsjlt.com/news/201964.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实现将MongoDB中的数据导入到MySQL
    本文主要介绍了一个将 MongoDB 中的数据导入到 mysql 中的 python 工具类 MongoToMysql。该工具类实现了获取 MongoDB 数据类型、创建 MySQL 表结构以及将数据从 MongoDB ...
    99+
    2023-05-05
    Python实现MongoDB数据导入MySQL Python MongoDB数据导入MySQL Python MongoDB MySQL
  • 怎么将Mysql数据导入到MongoDB
    今天就跟大家聊聊有关怎么将Mysql数据导入到MongoDB,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。(1)从mysql导出数据位csv文件,如...
    99+
    2024-04-02
  • mongodb怎么将mysql数据导入
    要将MySQL数据导入MongoDB,可以按照以下步骤操作:1. 使用MYSQL的`SELECT`语句将数据从MySQL中导...
    99+
    2023-08-30
    mongodb mysql
  • 怎么将oracle数据导入到mysql中
    本篇文章为大家展示了怎么将oracle数据导入到mysql中,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。    1、在PL/SQL中用sele...
    99+
    2024-04-02
  • 如何将sqlite3中数据导入到mysql中
    小编给大家分享一下如何将sqlite3中数据导入到mysql中,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!方法如下:从sqli...
    99+
    2024-04-02
  • Python将数据库数据导入到EXCEL
          每次给运营导数据的时候,如果不用工具的话,就是直接生成.csv格式的文件,这样的文件不支持'sheet',每次还有手工进行,相当的不科学,今天试试Python生成excel文件。        写的糙了点,但是这是一个很好的开始...
    99+
    2023-01-31
    导入到 数据库 数据
  • Sqoop怎么将MySQL数据导入到hive中
    这篇文章主要讲解了“Sqoop怎么将MySQL数据导入到hive中”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Sqoop怎么将MySQL数据导入到hive中”吧!MySQL表:mysql&...
    99+
    2023-06-02
  • 如何从mysql中将数据导入到oracle数据库中
    这篇文章主要讲解了“如何从mysql中将数据导入到oracle数据库中”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何从mysql中将数据导入到oracl...
    99+
    2024-04-02
  • Navicat中怎么将Oracle数据库导入到MySQL
    本篇文章给大家分享的是有关Navicat中怎么将Oracle数据库导入到MySQL,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一.下载和激活...
    99+
    2024-04-02
  • 将数据从文本导入到mysql(转)
    将数据从文本导入到mysql(转)[@more@]access中可以将文本中的数据轻松导入表中,mysql中用起来没那么方便,其实起来也很简单。 首先将数据记录按行处理好用特定的字符分开如:“,” 记录形如...
    99+
    2024-04-02
  • 怎么将原有的Oracle数据库中的数据导入到MySQL中
    本篇内容主要讲解“怎么将原有的Oracle数据库中的数据导入到MySQL中”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么将原有的Oracle数据库中的数据导...
    99+
    2024-04-02
  • 如何将matlab数据导入到Python中使用
    相信不少小伙伴都遇到过和我一样的问题,就是在尝试使用scipy.io.loadmat将matlab类型的数据导入python中的时候遇到如下错误提示。 import scipy as...
    99+
    2022-12-15
    matlab数据导入到Python中使用 matlab导入Python
  • [sqoop]将hive查询后的数据导入到MySQL
    一、知识点 export:将Hive的表导入到mysql叫导出 搜了很多,发现sqoop在hive导出到mysql时 1)不支持where参数对数据进行过滤。 2)不支持指定hive表的方式导出,只能指定Hive目录进行导出。 二...
    99+
    2023-09-24
    hive sqoop mysql
  • Kafka中如何将数据导入到Elasticsearch
    本篇文章为大家展示了Kafka中如何将数据导入到Elasticsearch,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Elasticsearch作为当前主流的全文检索引擎,除了强大的全文检索能力和...
    99+
    2023-06-02
  • 如何将 .sql 文件导入到 MySQL 数据库?
    导入 SQL 文件到 MySQL 数据库是一个常见的任务,本文将介绍如何执行该操作。我们将逐步讲解具体的步骤,帮助您完成这个过程。 步骤 1: 打开命令提示符或终端 首先,在您的计算机上打开命令提示符或终端窗口。这将是执行导入操作的地方。 ...
    99+
    2023-09-18
    数据库 mysql sql
  • node.js中怎么将MongoDB数据同步到MySQL
    node.js中怎么将MongoDB数据同步到MySQL,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。环境node.jsMon...
    99+
    2024-04-02
  • MySQL中怎么实现数据的导出与导入
    这期内容当中小编将会给大家带来有关MySQL中怎么实现数据的导出与导入,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先讲解mysql数据的导出。打开工具heidisql...
    99+
    2024-04-02
  • 如何将RRD数据库中数据导入MYSQL中
    本篇文章为大家展示了如何将RRD数据库中数据导入MYSQL中,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。将RRD数据库中数据导入MYSQL中一、RRD数据库及RR...
    99+
    2024-04-02
  • Java中用POI实现将数据导出到Excel
    一、前言 数据导出为Excel在我们写项目的过程中经常用到 需要用到的jar包 poi-3.17.jar 二、具体实现步骤 //第一步创建一个webbook,对应一个Excel...
    99+
    2024-04-02
  • 把ACCESS的数据导入到Mysql中(转)
    把ACCESS的数据导入到Mysql中(转)[@more@]在建设网站的过程中,经常要处理一些数据的导入及导出.在Mysql数据库中,有两种方法来处理数据的导出(一般). 1. 使用select ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作