我在不同的服务器上有两个表,我希望找到一种有效的方法来组合和匹配数据集。这是一个例子:
从包含我们故事的服务器1,我执行如下查询:
query = """SELECT author_id, title, text
FROM stories
ORDER BY timestamp_created DESC
LIMIT 10
"""
results = DB.getAll(query)
for i in range(len(results)):
#Build a string of author_ids, e.g. '1314,4134,2624,2342'
但是,我想从服务器2获取有关每个author_id的一些信息:
query = """SELECT id, avatar_url
FROM members
WHERE id IN (%s)
"""
values = (uid_list)
results = DB.getAll(query, values)
现在我需要一些方法来组合这两个查询,所以我有一个dict,它有故事以及avatar_url和member_id。
如果这些数据在一台服务器上,那么它将是一个简单的连接,如下所示:
SELECT *
FROM members, stories
WHERE members.id = stories.author_id
但是,由于我们将数据存储在多个服务器上,因此无法实现。
最有效的方法是什么?我理解合并可能必须在我的应用程序代码中发生...任何有效的示例代码,最小化dict循环的数量将非常感激!
感谢。
答案 0 :(得分:2)
如果内存不是问题,您可以使用字典。
results1_dict = dict((row[0], list(row[1:])) for row in results1)
results2_dict = dict((row[0], list(row[1:])) for row in results2)
for key, value in results2_dict:
if key in results1_dict:
results1_dict[key].extend(value)
else:
results1_dict[key] = value
这不是特别有效(n 2 ),但它相对简单,你可以调整它来做你所需要的。
答案 1 :(得分:0)
您必须以某种方式将数据汇集在一起。
有些服务器链接(尽管可能不是mysql上下文中的正确术语)可能允许查询不同的数据库。这打开了另一组问题(安全性!)
更简单的解决方案是将数据放在一个数据库中。
最后一个(最不理想的)解决方案是像Padmarag建议的那样加入代码。
答案 2 :(得分:0)
唯一的选择看起来是数据库链接,但遗憾的是在MySQL中不可用 您必须在应用程序代码中进行合并。最好将数据保存在同一个数据库中。
答案 3 :(得分:0)
是否可以设置从一台服务器到另一台服务器的所需表的复制? 这样你就可以在一台服务器上拥有所有数据。
此外,请参阅FEDERATED存储引擎,自mysql 5.0.3以来可用。