我正在开发一个Django应用程序,它同时使用MySQL和MongoDB来存储数据。我需要做的是比较存储在MongoDB集合中的数据和存储在MySQL表中的数据。
例如,我的MySQL数据库包含“关系”表,该表是使用以下方法创建的:
CREATE TABLE relations (service_id int, beneficiary_id int, PRIMARY KEY (service_id, beneficiary_id));我的MongoDB包含一个名为" relation“的集合,它将存储与MySQL中的关系表相同的数据。以下是收藏“关系”的一份文件:
{'_id': 0, 'service_id': 1, 'beneficiary_id': 32}我尝试创建一个python脚本来比较MySQL中的关系表和Mongo中的关系集合之间的数据。该脚本的工作方式如下:
mysql_relations = Relations.objects.values('beneficiary_id', 'service_id')
mongo_relations_not_in_mysql = relations_mongodb.find({'$nor':list(mysql_relations)})
mongo_relations = relations_mongodb.find({}, {'_id': 0, 'beneficiary_id':1, 'service_id': 1})
filter_list = Q()
for mongo_relation in mongo_relations:
filter_list &= Q(mongo_relation)
mysql_relations_not_in_mongo = Relations.objects.exclude(filter_list)但是,这段代码要花费很长时间。我认为主要的问题是因为主键由2列组成,这需要使用Q()和‘nor’。
你有什么建议?
发布于 2021-01-11 19:48:59
为了防止有人感兴趣,我使用了以下解决方案来优化数据比较。
(这个想法是创建一个临时的MySQL表来存储mongo的数据,然后在MySQL表之间进行比较)。守则如下:
mongo_relations = relations_mongodb.find({},{'_id':0,'service_id':1,‘受益人_id’:1})
游标= connection.cursor() cursor.execute(“创建临时表temp_relations (service_id int,beneficiary_id int,索引id\_related (service\_id,beneficiary\_id) )”)
cursor.executemany(‘插入到temp_relations (service_id,beneficiary_id)值(%(service_id)s,%(Beneficiary_id)s ',list(mongo_relations) )
cursor.execute (“选择service_id,从temp_relations中选择beneficiary_id,其中(service_id,beneficiary_id)不是IN”(“从关系中选择service_id,beneficiary_id )”) mongo_relations_not_in_mysql =
cursor.execute (“SELECT id,service_id,beneficiary_id,date FROM relations (service_id,beneficiary_id) not IN”);mysql_relations_not_in_mongo = cursor.fetchall() cursor.close() #关闭与MySQL的连接
https://stackoverflow.com/questions/65645675
复制相似问题