gpt4 book ai didi

python - 如何在多个 Python 词典上执行类似 INNER JOIN 的 SQL

转载 作者:太空宇宙 更新时间:2023-11-04 05:53:08 25 4
gpt4 key购买 nike

我目前正在计划开发一个 Django 应用程序,它不仅允许用户构建与模型关联的自定义表(例如,用户可以创建一个与“员工”模型关联的简单自定义“ parking 位”表,而无需编辑 models.py),但也可以使用这些自定义表格构建自定义报告。我能想到的唯一方法是拥有一个将自定义表数据存储在 JSONField 中的模型(我使用 Postgres 作为后端,所以这实际上效果很好),然后拥有一个允许用户构建的报告模型并保存为自定义报告返回连接数据集的“类 SQL”查询。

我已经弄清楚如何存储自定义表格并在我的应用程序中使用它们,我什至对如何在伪外键上合并多个 JSON 对象以拉入自定义报告有一个松散的概念,但我只有就创建一对一 连接而言。

使用下面的脚本,如果我的任何字典在单个外键上有多个记录,则只使用最后一条记录。有谁知道如何完成多个 Python 词典的一对多连接?

如果我有这三个数据集:

employees = [{"id": 1, "user_id": 303, "name": "Mike"},
{"id": 2, "user_id": 304, "name": "James"},
{"id": 3, "user_id": 305, "name": "David"},]

roles = [{"id": 1, "user_id": 303, "role": "Manager"},
{"id": 2, "user_id": 304, "role": "Assistant"},
{"id": 3, "user_id": 305, "role": "Assistant"},]

absences = [{"id": 1, "user_id": 303, "date": "2015-03-01"},
{"id": 2, "user_id": 303, "date": "2015-03-02"},
{"id": 3, "user_id": 303, "date": "2015-03-03"},
{"id": 4, "user_id": 304, "date": "2015-03-15"},
{"id": 5, "user_id": 305, "date": "2015-03-19"},]

我希望直接连接的结果是:

[{'date': '2015-03-01', 'role': 'Manager', 'user_id': 303, 'id': 1, 'name': 'Mike'},
{'date': '2015-03-02', 'role': 'Manager', 'user_id': 303, 'id': 1, 'name': 'Mike'},
{'date': '2015-03-03', 'role': 'Manager', 'user_id': 303, 'id': 1, 'name': 'Mike'},
{'date': '2015-03-15', 'role': 'Assistant', 'user_id': 304, 'id': 2, 'name': 'James'},
{'date': '2015-03-19', 'role': 'Assistant', 'user_id': 305, 'id': 3, 'name': 'David'}]

但由于我的脚本首先循环遍历我的 FROM 字典(在本例中为 employees),我所能得到的是:

[{'date': '2015-03-03', 'role': 'Manager', 'user_id': 303, 'id': 1, 'name': 'Mike'},
{'date': '2015-03-15', 'role': 'Assistant', 'user_id': 304, 'id': 2, 'name': 'James'},
{'date': '2015-03-19', 'role': 'Assistant', 'user_id': 305, 'id': 3, 'name': 'David'}]

这里是我的代码的基础:

def joiner(from_table, joins):
report_data = []

for row in from_table:
new_row = row
for table in joins:
table_dict = table["table"]
table_fk = table["fk"]
for tdr in table_dict:
if tdr[table_fk] == row[table_fk]:
for field in table["fields"]:
new_row[field] = tdr[field]
report_data = from_table
return report_data

join_tables = [{"table": roles, "fk": "user_id", "fields": ["role"]},
{"table": absences, "fk": "user_id", "fields": ["date"]},
]
joiner(employees, join_tables)

我能想到的最简单的解决方法是从“缺席”字典开始作为 from_table 而不是 employees,但这是一个多对一的连接,这对我的目的来说是非常有限的。

此外,如果有人对构建用户创建的数据模式有更好的想法,这些模式可以使用 django 合并到自定义报告中,我会洗耳恭听。我能想到的唯一其他解决方案是完全绕过 Django 模型,只使用直接 SQL 创建、更新和查询所有自定义表。

最佳答案

只要在调用merge的时候把最长的字典列表放在最前面(可以方便修改),这里是一个粗略的解决方案

    def merge_lists(listdict1, listdict2,listdict3, joinkey):
mergedlist=listdict1
for i in range(len(listdict1)):
for j in range(len(listdict2)):
if (listdict1[i][joinkey]==listdict2[j][joinkey]):
for keys in listdict2[j].keys():
mergedlist[i][keys]=listdict2[j][keys]
for k in range(len(listdict3)):
if listdict1[i][joinkey]==listdict3[k][joinkey]:
for keys in listdict3[k].keys():
mergedlist[i][keys]=listdict3[k][keys]
return mergedlist

merge_lists(absences, employees, roles, "user_id")


[
{
"date":"2015-03-01",
"id":1,
"name":"Mike",
"role":"Manager",
"user_id":303
},
{
"date":"2015-03-02",
"id":1,
"name":"Mike",
"role":"Manager",
"user_id":303
},
{
"date":"2015-03-03",
"id":1,
"name":"Mike",
"role":"Manager",
"user_id":303
},
{
"date":"2015-03-15",
"id":2,
"name":"James",
"role":"Assistant",
"user_id":304
},
{
"date":"2015-03-19",
"id":3,
"name":"David",
"role":"Assistant",
"user_id":305
}
]

关于python - 如何在多个 Python 词典上执行类似 INNER JOIN 的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29173566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com