使用 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