带SQL插入的Python嵌套字典

带SQL插入的Python嵌套字典,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,在处理一个XML文件之后,我生成了一个非常大的字典,我正在寻找从这个字典中提取的内容,并将列和值插入到我的mySQL数据库表中 我正在使用Python3 字典是嵌套的;下面是一个简单的例子: d ={'Test1'{'TestID':'first','Dev_Type':'this device','Version':'v1_0','Address':'some Address'} 'Test2'{'TestID':'second','Dev_Type':'that device','V

在处理一个XML文件之后,我生成了一个非常大的字典,我正在寻找从这个字典中提取的内容,并将列和值插入到我的mySQL数据库表中

我正在使用Python3

字典是嵌套的;下面是一个简单的例子:

d ={'Test1'{'TestID':'first','Dev_Type':'this device','Version':'v1_0','Address':'some Address'}
    'Test2'{'TestID':'second','Dev_Type':'that device','Version':'v1_0','Address':'other Address'}
    'Test3'{'TestID','third','Dev_Type':'other device','Version':'v1_0','Address':'another Address'}
} 
本质上,我希望迭代此字典中的每个主键(例如Test1、Test2、Test3),并将辅助键提取为列名元组,将关联的辅助键值提取为值元组,有点像这样:

cols = ('TestID','Dev_Type','Version','Address')
vals = ('first','this device','v1_0','some Address')
在迭代每个主键时,我将使用以下命令将两个元组添加到mySQL表中:

sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(', '.join(cols), ', '.join(['%s'] * len(cols)));
try:
    cursor.execute(sql, vals)
except Exception as e:
    print(e)
    pass
然后对下一个主键('Test2')重复该过程

我已进行了初步尝试,但在本例中已硬编码主键:

for k, v in d:
    #Missing appropriate method here
    cols = tuple(d['Test1'].keys())
    vals = tuple(d['Test1'].values())

    sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(', '.join(cols), ', '.join(['%s'] * len(cols)));
    try:
        cursor.execute(sql, vals)
    except Exception as e:
        pass

connection.close()
return

您可以迭代
d.values()
并使用嵌套字典上的
.keys()
.values()
方法来获取列和值:

for v in d.values():
    cols = v.keys()
    vals = v.values()

    sql = "INSERT INTO Parameters ({}) VALUES ({})".format(
        ', '.join(cols),
        ', '.join(['%s'] * len(cols)));
    try:
        cursor.execute(sql, vals)
    except Exception as e:
        pass

请注意,在Python 3和返回字典键和值的视图(与Python 2中的列表不同)。

您可以迭代
d.values()
并使用嵌套字典上的
.keys()
.values()
方法来获取列和值:

for v in d.values():
    cols = v.keys()
    vals = v.values()

    sql = "INSERT INTO Parameters ({}) VALUES ({})".format(
        ', '.join(cols),
        ', '.join(['%s'] * len(cols)));
    try:
        cursor.execute(sql, vals)
    except Exception as e:
        pass

请注意,在Python3中,返回字典键和值的视图(与Python2中的列表不同)。

在字典上迭代实际上是在键上迭代等价于d中k的
。keys():
。您正在寻找
方法,这些方法实际上会以元组的形式返回键和值:

for k, v in d.items():
    # k will take the values 'Test1', 'Test2', etc.
    # v will take the values of the corresponding nested dicts.

我建议在
值上使用
,因为这样您将有一个正在处理的主键(测试)的引用。我将在这里冒一个险,并猜测您将需要这个程序的非平凡版本

从这里开始,您可以在尝试使用
d[…]
时使用
v
,因为这正是它的本质:

for k, v in d.items():
    cols = v.keys()
    vals = v.values()

    sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(
                ', '.join(cols),
                ', '.join(['%s'] * len(v))
    )

    try:
        cursor.execute(sql, vals)
    except Exception as e:
        pass

connection.close()
return

由于
v
是一个嵌套字典,您可以获得
cols
vals
中的元素数,就像
len(v)
迭代字典实际上迭代键一样等价于d中k的
。keys():
。您正在寻找
方法,这些方法实际上会以元组的形式返回键和值:

for k, v in d.items():
    # k will take the values 'Test1', 'Test2', etc.
    # v will take the values of the corresponding nested dicts.

我建议在
值上使用
,因为这样您将有一个正在处理的主键(测试)的引用。我将在这里冒一个险,并猜测您将需要这个程序的非平凡版本

从这里开始,您可以在尝试使用
d[…]
时使用
v
,因为这正是它的本质:

for k, v in d.items():
    cols = v.keys()
    vals = v.values()

    sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(
                ', '.join(cols),
                ', '.join(['%s'] * len(v))
    )

    try:
        cursor.execute(sql, vals)
    except Exception as e:
        pass

connection.close()
return

由于
v
是一个嵌套字典,您可以获得
cols
vals
中元素的数量,就像
len(v)
一样
v.values()
是否保证
v.values()
始终与键列表的顺序相同
list(v)
?否则,您将在不匹配的列中插入错误的值。
d.keys()
d.values()
。但是没有提到列表(d)
。是的,这看起来更好。你可以做
len(v)
,而不是不必要地将
cols
转换为列表。打得好。直到现在,我才意识到
迭代器实际上定义了长度。感谢您指出这一点。是否可以保证
v.values()
始终与键列表的顺序相同
list(v)
?否则,您将在不匹配的列中插入错误的值。
d.keys()
d.values()
。但是没有提到列表(d)
。是的,这看起来更好。你可以做
len(v)
,而不是不必要地将
cols
转换为列表。打得好。直到现在,我才意识到
迭代器实际上定义了长度。感谢您指出这一点。这是相切的,但您应该使用数据库API的参数替换来防止SQL注入:您的示例dict中的键和值之间是否要省略
?这是相切的,但是您应该使用数据库API的参数替换来防止SQL注入:您的示例dict中的键和值之间是否要省略