как загрузить список словарей в базу данных postgresql?
У меня есть результат, список словарей
data = [
{
"Object": "info 1",
"subobject": "info 2",
"Name": "info 3",
"Ip": "info 4",
"Status": "info 5",
"Mac": "info 6",
"Worker": "info 7",
"Sn": "info 8",
},
{
"Object": "info 9",
"subobject": "info 10",
"Name": "info 11",
"Ip": "info 12",
"Status": "info 13",
"Mac": "info 14",
"Worker": "info 15",
"Sn": "info 16",
"#4F6128": "info 17",
"#F79646": "info 18",
"#92D050": "19",
"#A00000": "info 20"
}
]
Подскажите пожалуйста, как и что лучше использовать чтобы все это добавить в базу данных postgresql??
Ответы (1 шт):
Автор решения: Alexey Trukhanov
→ Ссылка
- Для начала, надо создать базу и таблицу со всеми полями-ключами, которые встречаются в этих словарях
- Потом воспользоваться библиотекой:
import psycopg2
from psycopg2 import sql
- Законнектить базу:
conn = psycopg2.connect(
dbname=dbname,
user=user,
password=password,
host=host
)
- Перегнать список словарей в список кортежей, при этом "добив" недостающие поля NaN в те кортежи, у которых отсутствуют какие-то поля:
data_tuple = [
tuple(d.values()) + (float('nan'),)*(len(max(data, key=len)) - len(d))
for d in data
]
Внимание! Это будет работать корректно, только если порядок ключей в словарях не нарушается. Если порядок ключей в словарях хаотичен, то надо пересобирать список кортежей из списка словарей явно указывая на каком месте в кортеже должно стоять то или иное значение.
- Ну, и, например, вот так все это положить в базу (тут пример с контекстным менеджером и безопасным SQL запросом, можно и проще, но не так безопасно). Вместо
<table_name>подставьте имя таблицы, а вместо <field_name> имена своих полей:
with conn.cursor() as cursor:
conn.autocommit = True
insert = (
sql.SQL(
'INSERT INTO <table_name> (<field1_name>, <field2_name>,..) VALUES {}')
.format(sql.SQL(',').join(map(sql.Literal, data_tuple))
)
)
cursor.execute(insert)