как загрузить список словарей в базу данных 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
  1. Для начала, надо создать базу и таблицу со всеми полями-ключами, которые встречаются в этих словарях
  2. Потом воспользоваться библиотекой:
import psycopg2
from psycopg2 import sql
  1. Законнектить базу:
conn = psycopg2.connect(
    dbname=dbname,
    user=user,
    password=password,
    host=host
)
  1. Перегнать список словарей в список кортежей, при этом "добив" недостающие поля NaN в те кортежи, у которых отсутствуют какие-то поля:
data_tuple = [
    tuple(d.values()) + (float('nan'),)*(len(max(data, key=len)) - len(d)) 
    for d in data
]

Внимание! Это будет работать корректно, только если порядок ключей в словарях не нарушается. Если порядок ключей в словарях хаотичен, то надо пересобирать список кортежей из списка словарей явно указывая на каком месте в кортеже должно стоять то или иное значение.

  1. Ну, и, например, вот так все это положить в базу (тут пример с контекстным менеджером и безопасным 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)
→ Ссылка