上述代码有以下警告 应为类型 'tuple[float | int | Decimal | str | bytes | date | timedelta | datetime | set[str] | None, ...]' (匹配的泛型类型 '_T'),但实际为 'dict[str, float | int | Decimal | str | bytes | date | timedelta | datetime | set[str] | None]'
时间: 2023-08-21 13:05:50 浏览: 188
proposal-record-tuple:关于Record和Tuple值类型的ECMAScript建议。 | 第二阶段
感谢指出错误。警告是由于在返回的 JSON中,节点数据以字典的形式存在,而不是元组。这可以通过将查询结果转换为字典形式来解决。
以下是修改后的代码示例:
```python
@app.route('/api/get_data', methods=['GET', 'POST'])
def get_data():
keyword = request.args.get('keyword') # 获取请求参数 keyword
cursor = mysql.cursor()
# 根据关键字查询nodes表的数据
if keyword:
cursor.execute("SELECT * FROM nodes WHERE type=%s", (keyword,))
nodes_data = cursor.fetchall()
else:
cursor.execute("SELECT * FROM nodes")
nodes_data = cursor.fetchall()
# 获取节点的ID列表
node_ids = [row[0] for row in nodes_data]
edges_set = set() # 使用集合存储边数据,确保每条边只出现一次
# 根据节点的ID查询相关的边数据
for node_id in node_ids:
cursor.execute("SELECT * FROM edges WHERE `from_id`=%s or `to_id`=%s", (node_id, node_id))
edges_data = cursor.fetchall()
for row in edges_data:
edge = {
'from': row[0],
'to': row[1],
'label': row[2],
'arrows': row[3]
}
edges_set.add((edge['from'], edge['to'], edge['label'], edge['arrows'])) # 将边数据添加到集合中
# 补全缺少的节点信息
if keyword:
existing_node_ids = set(node_ids) # 存储已有节点的ID
for node_id in node_ids:
if node_id not in existing_node_ids:
cursor.execute("SELECT * FROM nodes WHERE id=%s", (node_id,))
node_data = cursor.fetchone()
if node_data:
node = {
'id': node_data[0],
'type': node_data[1],
'label': node_data[2]
}
nodes_data.append(node)
existing_node_ids.add(node_id)
cursor.close()
return jsonify({'nodes': nodes_data, 'edges': list(edges_set)})
```
现在,返回的 JSON 数据中的节点数据应该是以字典形式存在,而不再产生警告。
阅读全文