业务场景:需要将一个客户的所有沟通记录添加到一个客户中去,但是不知道客户被沟通的次数,导致不知道应该添加多少字段,mysql扩展性差,不能满足这个需求。mongodb作为文档型数据库,可以随意增删字段,在这方面的优势比较突出。下面是用python 将MYSQL存储到MONGODB的一个简单例子。
使用工具版本如下:
python 3.7
MONGODB3.4
MYSQL 5.5
- # 导入pymysql,pymongo的包
- import pymysql;
- import pymongo;
-
- class Connect:
- def mysqlCon(self,host,user,passwd,db,port,charset):
- # MYSQL连接,获取一个数据库连接,注意如果是UTF-8类型的,需要指定数据库
- conn = pymysql.connect(host=host, user=user, passwd=passwd, db=db, port=port, charset=charset);
- # 获取一个游标
- cur = conn.cursor();
- return conn,cur;
-
- def mongoCon(self,host,port):
- # MONGODB连接
- mongoclient=pymongo.MongoClient("localhost", port=27017);
- # 获取mongodb集合
- collection = mongoclient.mydb.communication_log;
- return mongoclient,collection;
-
-
-
- try:
- connect = Connect();
-
- conn, cur = connect.mysqlCon(host='192.168.1.200', user='fang_read', passwd='read2wsx', db='fangdb', port=3307,charset='utf8');
- cur.execute('select customer_id,create_user_id,content,create_time from crm_communication_log a order by create_time desc limit 100000');
- data = cur.fetchall();
-
- mongoclient, collection = connect.mongoCon("localhost", port=27017);
- # 根据customer_id字段,将同一个客户的沟通记录放在了一个set内嵌文档中
- for d in data:
- collection.update_many({"customer_id": d[0]},
- {"$addToSet": {"log": {"create_user_id": d[1], "content": d[2], "create_time": d[3]}}},
- upsert=True);
- cur.close();
- conn.close();
- mongoclient.close();
- except Exception as e:
- print(e);
-
-
这里将mysql迁移到mongodb使用python主要是为了实现将同一个客户的沟通记录放在一个内嵌文档中的目的。此次迁移有10万的数据量,大概耗时40分钟,时间还是很久的,以后有好的解决方案还会继续更新。
如果只是简单的迁移,还有很多其他更简单的方法可以使用,这里就不再详述。