Python代码无法从JSON文件向PostgreSQL插入数据问题排查
问题:Python无法从JSON提取数据插入PostgreSQL表中?
我尝试通过Python从JSON文件设计并实现数据库模型,但代码无法将数据插入PostgreSQL表中,始终无法向列表table_of_policies中添加数据。以下是我的代码:
import json import psycopg2 class Policy: def __init__(self, type, name, rule_exists): self.type = type self.name = name self.rule_exists = rule_exists # load json data from the file with open("demo_data.json", 'r') as file: policy_data = json.load(file) first_level = policy_data["uniconfig-topology:configuration"] second_level = first_level["Cisco-IOS-XR-infra-policymgr-cfg:policy-manager"] third_level = second_level["policy-maps"] forth_level = third_level["policy-map"] table_of_policies = [] for item in forth_level: if "policy-map" in item: # forth_level = item type = forth_level['type'] name = forth_level['name'] rule_exists = 'policy-map-rule' in forth_level policy_map = Policy(type, name, rule_exists) table_of_policies.append(policy_map) #print(forth_level) conn = psycopg2.connect( host="localhost", database="postgres", user="postgres", password="postgres", port="5432" ) cursor = conn.cursor() cursor.execute("DROP TABLE IF EXISTS policy_map") cursor.execute('''create table policy_map ( type VARCHAR(255), name VARCHAR(255), rule_exists BOOLEAN) ''') for policy_map in table_of_policies: insert_data = "INSERT INTO policy_map (type, name, rule_exists) VALUES (%s, %s, %s)" cursor.execute(insert_data, (policy_map.type, policy_map.name, policy_map.rule_exists)) conn.commit()
代码中的核心问题
循环错误引用全局列表而非当前元素
遍历forth_level时,你错误地使用forth_level['type']、forth_level['name']获取值,但forth_level是整个列表对象,并非当前循环的字典元素。正确的方式应该使用循环变量item来访问对应键值。条件判断不符合JSON结构导致逻辑跳过
if "policy-map" in item:这个判断条件大概率不匹配你的JSON数据结构。如果forth_level是由包含type、name字段的字典组成的列表,那么这个条件永远不成立,直接跳过了Policy实例化和列表添加的逻辑,导致table_of_policies为空。使用Python内置关键字作为变量名
type是Python的内置关键字,用作变量名可能引发潜在问题,建议改用type_val这类名称。
修正后的关键代码部分
table_of_policies = [] for item in forth_level: # 直接从当前item提取字段,用get()避免键不存在抛出KeyError type_val = item.get('type') name_val = item.get('name') # 检查当前item是否包含policy-map-rule字段 rule_exists = 'policy-map-rule' in item # 确保必要字段存在再添加到列表 if type_val and name_val: policy_map = Policy(type_val, name_val, rule_exists) table_of_policies.append(policy_map) # 可添加调试语句查看列表内容 # print(table_of_policies)
额外调试建议
- 在循环内添加
print(item),查看每个元素的实际结构,确认键名是否和你预期一致。 - 检查JSON文件的层级结构,确保
forth_level = third_level["policy-map"]确实返回的是包含多个字典的列表。
内容的提问来源于stack exchange,提问作者infuro
相关产品推荐
相关产品推荐

