带SQL插入的Python嵌套字典
在处理一个XML文件之后,我生成了一个非常大的字典,我正在寻找从这个字典中提取的内容,并将列和值插入到我的mySQL数据库表中 我正在使用Python3 字典是嵌套的;下面是一个简单的例子:带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
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中的列表不同)。在字典上迭代实际上是在键上迭代
。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中的键和值之间是否要省略:
?