使用 pymongo 将数据从 Mysql 迁移到 MongoDB

Posted

技术标签:

【中文标题】使用 pymongo 将数据从 Mysql 迁移到 MongoDB【英文标题】:Migrate data from Mysql to MongoDB using pymongo 【发布时间】:2021-11-05 05:44:04 【问题描述】:

我正在创建一个脚本 Python(使用 pymongo)来将我的数据从 mysql 迁移到 MongoDB(500 万行),但是我遇到了一些问题。 我的想法是使用 SQL 从 Mysql 中检索数据并创建一个 JSON 结构以插入到 MongoDB 中,但是数据类型存在问题,我不知道如何解决。

所以,我创建了一个简单的示例来说明问题。

    在 Mysql 中,我创建了一个表并插入一行。之后,我使用 SQL 将这个恢复到 MySQL:
CREATE TABLE employees (
  id1 int(11) NOT NULL AUTO_INCREMENT,
  nome1 varchar(255) NOT NULL,
  nick1 varchar(50) DEFAULT NULL,
  age1 int(5) NOT NULL,
  date1 date DEFAULT NULL,
  time1 time DEFAULT NULL,
  datetime1 datetime DEFAULT NULL,
  PRIMARY KEY (id1)
) ENGINE=MyISAM CHARSET=latin1;
INSERT INTO employees (id1, nome1, nick1, age1, date1, time1, datetime1) 
VALUES (1, 'MARIA SILVA', null, 35, '2020-12-23', '12:30:22', '2020-07-02 03:17:40');
SELECT * FROM employees;
+-----+-------------+-------+------+------------+----------+---------------------+
| id1 | nome1       | nick1 | age1 | date1      | time1    | datetime1           |
+-----+-------------+-------+------+------------+----------+---------------------+
|   1 | MARIA SILVA | NULL  |   35 | 2020-12-23 | 12:30:22 | 2020-07-02 03:17:40 |
+-----+-------------+-------+------+------------+----------+---------------------+
1 row in set (0.000 sec)
    到目前为止一切正常。让我们使用 pymongo 去 Python:
### Python Script - Retrieving data from Mysql
from pymongo import MongoClient
from pprint import pprint
import mysql.connector
import datetime

mydb = mysql.connector.connect(
  host="localhost",
  user="user",
  password="password",
  database="test"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM employees")
myresult = mycursor.fetchall()
for x in myresult:
    print(x)

结果如下。如果与 Mysql 相比返回完全不同的格式:

(1, 'MARIA SILVA', None, 35, datetime.date(2020, 12, 23), datetime.timedelta(seconds=45022), datetime.datetime(2020, 7, 2, 3, 17, 40))
    没关系,但现在我需要使用这个来创建一个 JSON 项并插入到 MongoDB 中
### Python Script - Retrieving data from Mysql and creating JSON item:
from pymongo import MongoClient
from pprint import pprint
import mysql.connector
import datetime

mydb = mysql.connector.connect(
   host="localhost",
   user="user",
   password="password",
   database="test"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM test")
myresult = mycursor.fetchall()
for x in myresult:
   item =  
      "_id" : int(x[0]), 
      "id1" : int(x[0]), 
      "name1" : x[1], 
      "nick1" : x[2], 
      "age1" : x[3], 
      "date1" : x[4], 
      "time1" : x[5], 
      "datetime1" : x[6] 
   
pprint(item)

结果是下面的 JSON:


   '_id': 1,
   'id1': 1, 
   'name1': 'MARIA SILVA',
   'nick1': None,
   'age1': 35,
   'date1': datetime.date(2020, 12, 23),
   'time1': datetime.timedelta(seconds=45022),
   'datetime1': datetime.datetime(2020, 7, 2, 3, 17, 40)
 

这就是问题所在。当我尝试将这个插入 MongoDB 时,我收到错误,因为 MongoDB 无法识别这些:

'nick1': None #(MongoDB uses null instead of None but I don't know how to fix it)
'date1': datetime.date(2020, 12, 23) #(I don't know how to do)
'time1': datetime.timedelta(seconds=45022), #(I don't know how to do)
'datetime1': datetime.datetime(2020, 7, 2, 3, 17, 40) #(I don't know how to do)

那么,有人可以帮助我将错误的 JSON 修复为正确的 JSON 以插入 MongoDB 吗?

最后,这是将项目插入 MongoDB 的代码:

### Python Script (continuing)- Inserting JSON item:
client = MongoClient('localhost', 27017)
db = client.test
col = db.employees
item_id = col.insert_one(item).inserted_id

【问题讨论】:

【参考方案1】:

使用 MongoDB 的 Studio 3T 工具(限于 1000 行,我得到了这个可接受的 MongoDB JSON:

 
    "_id" : NumberInt(1), 
    "id1" : NumberInt(1), 
    "name1" : "MARIA SILVA", 
    "nick1" : null, 
    "age1" : NumberInt(35),
    "date1" : ISODate("2020-12-23T03:00:00.000+0000"), 
    "time1" : "12:30:22", 
    "datetime1" : ISODate("2020-07-02T03:17:40.000+0000")

但是我怎样才能修复那个糟糕的 JSON 让它看起来像这样呢?

【讨论】:

以上是关于使用 pymongo 将数据从 Mysql 迁移到 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 flask_pymongo 将数据从 mongodb 显示到烧瓶模板?

怎么将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL

将 Rails 项目从 MySQL 迁移到 MongoDB

将 mysql db 从 XAMPP 迁移到 WAMP

docker - 如何将 mysql 数据从本地迁移到 ec2 实例

将 schema 和 SP 从 informix 迁移到 mysql