Хранилище результатов запроса MySQL в словаре с одним столбцом в качестве ключа

#python #mysql #sql #aggregate-functions

#python #mysql #sql #агрегатные функции

Вопрос:

Я наткнулся на эту проблему при попытке создать динамический файл инвентаризации в ansible. Информация о хосте была сохранена в таблице MySQL. Который выглядит следующим образом.

 Ip status
1.1.1.1 23
2.2.2.2 21
3.3.3.3 23
4.4.4.4 23
5.5.5.5 21
 

Я мог бы запросить это в python, но как мне создать словарь, который принимает статус в качестве ключа, и создать словарь с точным одним ключом в качестве значения статуса, со всеми значениями, присвоенными одному ключу.

Например.

 Dict[21] - {2.2.2.2, 5.5.5.5}
Dict2[23] - {1.1.1.1, 3.3.3.3, 4.4.4.4}
 

Ответ №1:

В MySQL для этого можно использовать агрегацию. Если вы хотите, чтобы список ip s был в виде строки CSV:

 select status, group_concat(ip) as ips
from mytable
group by status
 

Возможно, вы предпочтете массив JSON:

 select status, json_arrayagg(ip) as ips
from mytable
group by status
 

Комментарии:

1. Спасибо. Можем ли мы сделать это непосредственно в python, поскольку в конечном итоге несколько статусов будут объединены на основе требований к развертыванию в ansible.

2. @DilerSingh: ваши данные хранятся в таблице базы данных, поэтому будет эффективнее выполнить агрегацию в базе данных, используя вышеуказанные запросы, а затем получить результат из python.

Ответ №2:

Если у вас есть ввод в имени файла «ip.txt «, вы можете сделать:

 a = {}

with open("ip.txt") as file:
    for l in file:
       b=l.rstrip('n').split(' ')
       if b[1] in a:
          a[b[1]] = a[b[1]]   ','   b[0]
       else:
          a[b[1]] = b[0]

print(a)
 

вывод:
{'status': 'Ip', '23': '1.1.1.1,3.3.3.3,4.4.4.4', '21': '2.2.2.2,5.5.5.5'}

ПРИМЕЧАНИЕ: я не разработчик python, поэтому в этом коде могут быть возможности для улучшения.