Импорт объекта JSON в Postgresql с использованием Python

3

Я пытаюсь импортировать данные JSON в Postgresql с помощью Python, но получаю сообщение "psycopg2.ProgrammingError: невозможно адаптировать тип" dict ", когда я помещаю поле" via "с типом данных JSONB в созданную мной таблица в базе данных Postgresql. Есть ли способ исправить мою проблему? Любая помощь будет делать.

sample.json

[
  {
    "url": "https://www.abcd.com/",
    "id": 123456789,
    "external_id": null,
    "via": {
      "channel": "email",
      "id": 4,
      "source": {
        "from": {
          "address": "[email protected]",
          "name": "abc def"
        },
        "rel": null,
        "to": {
          "address": "[email protected]",
          "name": "def"
        }
      }
    }
  },
  {
    "url": "http://wxyz.com/",
    "id": 987654321,
    "external_id": null,
    "via": {
      "channel": "email",
      "id": 4,
      "source": {
        "from": {
          "address": "[email protected]",
          "name": "uvw xyz"
        },
        "rel": null,
        "to": {
          "address": "[email protected]",
          "name": "zxc"
        }
      }
    }
  }
]

my_code.py

import json
import psycopg2

connection = psycopg2.connect("host=localhost dbname=sample user=gerald password=1234")
cursor = connection.cursor()

data = []
with open('sample.json') as f:
    for line in f:
        data.append(json.loads(line))

fields = [
    'url', #varchar
    'id', #BigInt
    'external_id', #BigInt Nullable
    'via' #JSONB
]

for item in data:
    my_data = [item[field] for field in fields]
    insert_query = "INSERT INTO crm VALUES (%s, %s, %s, %s)"
    cursor.execute(insert_query, tuple(my_data))
  • 0
    Просто к вашему сведению. Синтаксис sample.json кажется ошибочным. Я сделаю редактирование и изменить его как можно скорее
Теги:
database
list
jsonb

2 ответа

3
Лучший ответ

Одним из решений является сброс dict до вставки в db:

for item in data:
    my_data = [item[field] for field in fields]
    for i, v in enumerate(my_data):
        if isinstance(v, dict):
            my_data[i] = json.dumps(v)
    insert_query = "INSERT INTO crm VALUES (%s, %s, %s, %s)"
    cursor.execute(insert_query, tuple(my_data))
0

Проблема, с которой я столкнулся при работе с этим кодом, заключается в цикле for... он перестает работать, когда встречает нулевое значение в одном из элементов JSON, полностью останавливая код. Если я хочу продолжить выполнение кода, что мне делать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню