我正在从数据库表中动态创建字典。 hosts_list
是我从host_names
表格中的hosts
列中选择的主机名列表。一旦我有了主机名列表,我就创建了一个字典,每个主机名都作为键,用空值初始化。 hosts_dict中的值是通过对同一个表的嵌套字典理解来设置的。
engine = create_engine('postgresql+psycopg2://postgres:postgres@localhost:5432/cm', convert_unicode=True)
metadata = MetaData(bind=engine)
db = engine.connect()
hosts = Table('hosts', metadata, autoload=True)
results = db.execute(select({hosts}))
hosts_list =[]
for x in results:
hosts_list.append(x[hosts.c.host_name])
hosts_dict = dict.fromkeys(hosts_list)
for key, value in hosts_dict.items():
hosts_dict[key] = {
{column : value for column,value in x.items()}
for x in results}
以下是我一直在使用的测试数据(为便于阅读而格式化):
Colums:hosts_id,host_uuid,host_name,host_ip,host_os,host_active
行:4; "35968946-2db0-4f85-b764-14c27ab3a57c";"test-04";"192.168.1.4";"RHEL 6.x";FALSE
以下是我的最终目标(为便于阅读而格式化):
{
'test-01': {
'hosts_id':'1',
'host_uuid':'a5c52229-34e5-4f54-a7da-b39149dedc13',
'host_name':'test-01',
'host_os':'Ubuntu 14.04',
'host_active':'True'},
'test-04': {
'hosts_id':'4'
'host_uuid':'35968946-2db0-4f85-b764-14c27ab3a57c'
'host_name':'test-04'
'host_ip':'192.168.1.4'
'host_os':'RHEL 6.6'
'host_active':'False'},
'test-03': {...},
'test-02': {...}
}
以下是我实际获得的结果:
print(hosts_dict)
{'test-01': set(), 'test-04': set(), 'test-03': set(), 'test-02': set()}
我不确定这意味着什么。我阅读了set()
上的文档,但我不太明白。使用[[print("'{0}':'{1}'".format(column,value)) for column, value in v.items()] for v in results]
我可以获得列的打印,并且每行的值如下:
'hosts_id':'1'
'host_uuid':'a5c52229-34e5-4f54-a7da-b39149dedc13'
'host_name':'test-01'
'host_ip':'192.168.1.1'
'host_os':'Ubuntu 14.04'
'host_active':'True'
...
我怎样才能从我的目标出发到最终目标呢?
答案 0 :(得分:1)
hosts_dict[key] = {
{column : value for column,value in x.items()}
for x in results}
是一个集合理解({item for ...}
),而不是字典理解({key: value for ...}
)。
hosts_dict.update({
key: {column : value for column,value in x.items()}
for x in results})
字典理解。但是,字典键的顺序是未定义的,因此假设key
与x
匹配,因为它们都是以results
从同一顺序派生的,这是错误的。
hosts_dict = {x[hosts.c.host_name]: {column: value for column, value in x.items()}
for x in results}
可能是你想要的。甚至,
hosts_dict = {x[hosts.c.host_name]: x.items() for x in results}
答案 1 :(得分:0)
这应该有效:
engine = create_engine('postgresql+psycopg2://postgres:postgres@localhost:5432/cm', convert_unicode=True)
metadata = MetaData(bind=engine)
db = engine.connect()
hosts = Table('hosts', metadata, autoload=True)
results = db.execute(select({hosts}))
hosts_dict = {}
for x in results:
host_name = x[hosts.c.host_name]
hosts_dict[host_name] = {column: value for column, value in x.items()}