проблема вставки данных json в базу данных postgresql с python - PullRequest
0 голосов
/ 03 марта 2019

main.py

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

fields = [
    'id', #integer
    'name', #varchar
    'log_date', #date
    'log_time', #timestamp
    'login', #timestamp
    'logout' #timestamp
]

for item in data:
    my_data = [item[field] for field in fields]
    insert_query = "INSERT INTO employee VALUES (%d, %s, %s, %s, %s, %s)"
    cur.execute(insert_query, tuple(my_data))

Error thorough

data.json

[
    {
        "id": 1,
        "name": "Prosenjit Das",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": null,
        "logout": null
    },
    {
        "id": 2,
        "name": "Sudipto Rahman",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": "11:26:45",
        "logout": "10:49:53"
    },
    {
        "id": 3,
        "name": "Trump Khatun",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": null,
        "logout": null
    }
]

столбцы postgresql

postgresql column fields

С моей базой данных все в порядке.В этой строке 37 изображения, когда я использую дампы вместо загрузок, в строке 50 показана другая проблема: «Ошибка типа: строковые индексы должны быть целыми числами».Обратите внимание, что здесь тип формата json является списком.Такие проблемы, но не совсем, я видел много, но должным образом не работает.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Так что пару изменений я бы сделал здесь

with open('data.json') as f:
    data = json.load(f)

# no need to do f.close() since we are using a context manager

fields = [
    'id', #integer
    'name', #varchar
    'log_date', #date
    'log_time', #timestamp
    'login', #timestamp
    'logout' #timestamp
]

for item in data:
    my_data = [item[field] for field in fields]
    insert_query = "INSERT INTO employee (id, name, log_date, log_time, login, logout) VALUES (%s, %s, %s, %s, %s, %s)"

    # also ALL placeholders must be %s even if it is an integer
    cur.execute(insert_query, tuple(my_data))

Также, если вы используете модуль psycopg2 для своих действий с БД, вы можете сделать следующее

from psycopg2.extras import execute_values

my_data = [tuple(item[field] for field in fields) for item in data]
insert_query = "INSERT INTO employee (id, name, log_date, log_time, login, logout) VALUES %s"
execute_values(cursor, insert_query, my_data) 
0 голосов
/ 03 марта 2019

Загрузите json в список диктовок один раз + убрав лишнюю запятую

import json

with open('data.json', 'r') as f:
    data = json.load(f)
# now  you can iterate and push to entries to DB

data.json

[
    {
        "id": 1,
        "name": "Prosenjit Das",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": null,
        "logout": null
    },
    {
        "id": 2,
        "name": "Sudipto Rahman",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": "11:26:45",
        "logout": "10:49:53"
    },
    {
        "id": 3,
        "name": "Trump Khatun",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": null,
        "logout": null
    }, --> was removed
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...