You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

代码中的核心问题

  1. 循环错误引用全局列表而非当前元素
    遍历forth_level时,你错误地使用forth_level['type']、forth_level['name']获取值,但forth_level是整个列表对象,并非当前循环的字典元素。正确的方式应该使用循环变量item来访问对应键值。

  2. 条件判断不符合JSON结构导致逻辑跳过
    if "policy-map" in item:这个判断条件大概率不匹配你的JSON数据结构。如果forth_level是由包含type、name字段的字典组成的列表,那么这个条件永远不成立,直接跳过了Policy实例化和列表添加的逻辑,导致table_of_policies为空。

  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:32:41