#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, поэтому в этом коде могут быть возможности для улучшения.